From 8e846fe6f84d357371008bab30a6812d512edbbd Mon Sep 17 00:00:00 2001 From: Shelikhoo Date: Thu, 7 Sep 2017 06:55:15 +0800 Subject: [PATCH 001/229] Added UDP TPROXY Transmit Support --- proxy/dokodemo/dokodemo.go | 16 +++++- transport/internet/udp/sourceForgeSender.go | 55 +++++++++++++++++++ .../internet/udp/sourceForgeSender_bad.go | 12 ++++ 3 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 transport/internet/udp/sourceForgeSender.go create mode 100644 transport/internet/udp/sourceForgeSender_bad.go diff --git a/proxy/dokodemo/dokodemo.go b/proxy/dokodemo/dokodemo.go index 5b031aa2..faecbe12 100644 --- a/proxy/dokodemo/dokodemo.go +++ b/proxy/dokodemo/dokodemo.go @@ -7,6 +7,8 @@ import ( "runtime" "time" + gonet "net" + "v2ray.com/core/app" "v2ray.com/core/app/dispatcher" "v2ray.com/core/app/log" @@ -16,6 +18,7 @@ import ( "v2ray.com/core/common/signal" "v2ray.com/core/proxy" "v2ray.com/core/transport/internet" + "v2ray.com/core/transport/internet/udp" ) type DokodemoDoor struct { @@ -88,7 +91,18 @@ func (d *DokodemoDoor) Process(ctx context.Context, network net.Network, conn in if network == net.Network_TCP { writer = buf.NewWriter(conn) } else { - writer = buf.NewSequentialWriter(conn) + //if we are in TPROXY mode, use linux's udp forging functionality + if !d.config.FollowRedirect { + writer = buf.NewSequentialWriter(conn) + } else { + srca := gonet.UDPAddr{IP: dest.Address.IP(), Port: int(dest.Port.Value())} + origsend, err := udp.TransmitSocket(&srca, conn.RemoteAddr()) + if err != nil { + return err + } + writer = buf.NewSequentialWriter(origsend) + } + } if err := buf.Copy(inboundRay.InboundOutput(), writer, buf.UpdateActivity(timer)); err != nil { diff --git a/transport/internet/udp/sourceForgeSender.go b/transport/internet/udp/sourceForgeSender.go new file mode 100644 index 00000000..31d03a9e --- /dev/null +++ b/transport/internet/udp/sourceForgeSender.go @@ -0,0 +1,55 @@ +// +build linux + +package udp + +import ( + "net" + "os" + "syscall" +) + +//Currently, Only IPv4 Forge is supported +func TransmitSocket(src net.Addr, dst net.Addr) (net.Conn, error) { + var fd int + var err error + fd, err = syscall.Socket(syscall.AF_INET, syscall.SOCK_DGRAM, 0) + if err != nil { + return nil, err + } + err = syscall.SetsockoptInt(fd, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1) + if err != nil { + return nil, err + } + + err = syscall.SetsockoptInt(fd, syscall.SOL_IP, syscall.IP_TRANSPARENT, 1) + if err != nil { + return nil, err + } + + ip := src.(*net.UDPAddr).IP.To4() + var ip2 [4]byte + copy(ip2[:], ip) + srcaddr := syscall.SockaddrInet4{} + srcaddr.Addr = ip2 + srcaddr.Port = src.(*net.UDPAddr).Port + err = syscall.Bind(fd, &srcaddr) + if err != nil { + return nil, err + } + ipd := dst.(*net.UDPAddr).IP.To4() + var ip2d [4]byte + copy(ip2d[:], ipd) + dstaddr := syscall.SockaddrInet4{} + dstaddr.Addr = ip2d + dstaddr.Port = dst.(*net.UDPAddr).Port + err = syscall.Connect(fd, &dstaddr) + if err != nil { + return nil, err + } + fdf := os.NewFile(uintptr(fd), "/dev/udp/") + c, err := net.FileConn(fdf) + if err != nil { + return nil, err + } + return c, nil +} diff --git a/transport/internet/udp/sourceForgeSender_bad.go b/transport/internet/udp/sourceForgeSender_bad.go new file mode 100644 index 00000000..dadd4023 --- /dev/null +++ b/transport/internet/udp/sourceForgeSender_bad.go @@ -0,0 +1,12 @@ +// +build !linux + +package udp + +import ( + "errors" + "net" +) + +func TransmitionSocket(src net.Addr, dst net.Addr) (net.Conn, error) { + return nil, errors.New("Using an Linux only functionality on an non-Linux OS.") +} From bae5639dfd52e7283a57a35fff897a8e8e7593dc Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sat, 7 Oct 2017 03:17:55 +0800 Subject: [PATCH 002/229] refactor --- common/buf/buffered_reader.go | 26 ++++++++++----------- common/protocol/headers.go | 44 +++++++++++++++++------------------ 2 files changed, 35 insertions(+), 35 deletions(-) diff --git a/common/buf/buffered_reader.go b/common/buf/buffered_reader.go index 8c7630ec..66ef5c06 100644 --- a/common/buf/buffered_reader.go +++ b/common/buf/buffered_reader.go @@ -21,33 +21,33 @@ func NewBufferedReader(rawReader io.Reader) *BufferedReader { } // IsBuffered returns true if the internal cache is effective. -func (v *BufferedReader) IsBuffered() bool { - return v.buffered +func (r *BufferedReader) IsBuffered() bool { + return r.buffered } // SetBuffered is to enable or disable internal cache. If cache is disabled, // Read() calls will be delegated to the underlying io.Reader directly. -func (v *BufferedReader) SetBuffered(cached bool) { - v.buffered = cached +func (r *BufferedReader) SetBuffered(cached bool) { + r.buffered = cached } // Read implements io.Reader.Read(). -func (v *BufferedReader) Read(b []byte) (int, error) { - if !v.buffered || v.buffer == nil { - if !v.buffer.IsEmpty() { - return v.buffer.Read(b) +func (r *BufferedReader) Read(b []byte) (int, error) { + if !r.buffered || r.buffer == nil { + if !r.buffer.IsEmpty() { + return r.buffer.Read(b) } - return v.reader.Read(b) + return r.reader.Read(b) } - if v.buffer.IsEmpty() { - if err := v.buffer.Reset(ReadFrom(v.reader)); err != nil { + if r.buffer.IsEmpty() { + if err := r.buffer.Reset(ReadFrom(r.reader)); err != nil { return 0, err } } - if v.buffer.IsEmpty() { + if r.buffer.IsEmpty() { return 0, nil } - return v.buffer.Read(b) + return r.buffer.Read(b) } diff --git a/common/protocol/headers.go b/common/protocol/headers.go index b9ecd1a9..dd541b68 100644 --- a/common/protocol/headers.go +++ b/common/protocol/headers.go @@ -37,22 +37,22 @@ const ( RequestOptionChunkMasking = RequestOption(0x04) ) -func (v RequestOption) Has(option RequestOption) bool { - return (v & option) == option +func (o RequestOption) Has(option RequestOption) bool { + return (o & option) == option } -func (v *RequestOption) Set(option RequestOption) { - *v = (*v | option) +func (o *RequestOption) Set(option RequestOption) { + *o = (*o | option) } -func (v *RequestOption) Clear(option RequestOption) { - *v = (*v & (^option)) +func (o *RequestOption) Clear(option RequestOption) { + *o = (*o & (^option)) } type Security byte -func (v Security) Is(t SecurityType) bool { - return v == Security(t) +func (s Security) Is(t SecurityType) bool { + return s == Security(t) } func NormSecurity(s Security) Security { @@ -72,11 +72,11 @@ type RequestHeader struct { User *User } -func (v *RequestHeader) Destination() net.Destination { - if v.Command == RequestCommandUDP { - return net.UDPDestination(v.Address, v.Port) +func (h *RequestHeader) Destination() net.Destination { + if h.Command == RequestCommandUDP { + return net.UDPDestination(h.Address, h.Port) } - return net.TCPDestination(v.Address, v.Port) + return net.TCPDestination(h.Address, h.Port) } type ResponseOption byte @@ -85,16 +85,16 @@ const ( ResponseOptionConnectionReuse = ResponseOption(0x01) ) -func (v *ResponseOption) Set(option ResponseOption) { - *v = (*v | option) +func (o *ResponseOption) Set(option ResponseOption) { + *o = (*o | option) } -func (v ResponseOption) Has(option ResponseOption) bool { - return (v & option) == option +func (o ResponseOption) Has(option ResponseOption) bool { + return (o & option) == option } -func (v *ResponseOption) Clear(option ResponseOption) { - *v = (*v & (^option)) +func (o *ResponseOption) Clear(option ResponseOption) { + *o = (*o & (^option)) } type ResponseCommand interface{} @@ -113,15 +113,15 @@ type CommandSwitchAccount struct { ValidMin byte } -func (v *SecurityConfig) AsSecurity() Security { - if v == nil { +func (sc *SecurityConfig) AsSecurity() Security { + if sc == nil { return Security(SecurityType_LEGACY) } - if v.Type == SecurityType_AUTO { + if sc.Type == SecurityType_AUTO { if runtime.GOARCH == "amd64" || runtime.GOARCH == "s390x" { return Security(SecurityType_AES128_GCM) } return Security(SecurityType_CHACHA20_POLY1305) } - return NormSecurity(Security(v.Type)) + return NormSecurity(Security(sc.Type)) } From 476d67f494878f7113c01e4c17afa3b50a2110b8 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 13 Oct 2017 15:32:40 +0800 Subject: [PATCH 003/229] new v2ray.cool config --- tools/release/config/vpoint_socks_vmess.json | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/tools/release/config/vpoint_socks_vmess.json b/tools/release/config/vpoint_socks_vmess.json index 27f7834c..28a13df1 100644 --- a/tools/release/config/vpoint_socks_vmess.json +++ b/tools/release/config/vpoint_socks_vmess.json @@ -18,7 +18,7 @@ "vnext": [ { "address": "v2ray.cool", - "port": 10086, + "port": 443, "users": [ { "id": "a3482e88-686a-4a58-8126-99c9df64b7bf", @@ -31,6 +31,16 @@ }, "mux": { "enabled": true + }, + "streamSettings": { + "network": "ws", + "security": "tls", + "tlsSettings": { + "allowInsecure": true + }, + "wsSettings": { + "path": "/v2ray.cool/" + } } }, "outboundDetour": [ From 669a0cafaf3646f2434286ec72ab2ca2cabfef3e Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 13 Oct 2017 23:54:04 +0800 Subject: [PATCH 004/229] support header override in websocket --- transport/internet/websocket/config.go | 10 ++++ transport/internet/websocket/config.pb.go | 68 ++++++++++++++--------- transport/internet/websocket/config.proto | 7 ++- transport/internet/websocket/dialer.go | 2 +- 4 files changed, 59 insertions(+), 28 deletions(-) diff --git a/transport/internet/websocket/config.go b/transport/internet/websocket/config.go index 4082f4fd..4469a83a 100644 --- a/transport/internet/websocket/config.go +++ b/transport/internet/websocket/config.go @@ -1,6 +1,8 @@ package websocket import ( + "net/http" + "v2ray.com/core/common" "v2ray.com/core/transport/internet" ) @@ -16,6 +18,14 @@ func (c *Config) GetNormailzedPath() string { return path } +func (c *Config) GetRequestHeader() http.Header { + header := http.Header{} + for _, h := range c.Header { + header.Add(h.Key, h.Value) + } + return header +} + func init() { common.Must(internet.RegisterProtocolConfigCreator(internet.TransportProtocol_WebSocket, func() interface{} { return new(Config) diff --git a/transport/internet/websocket/config.pb.go b/transport/internet/websocket/config.pb.go index c2a6abaf..3ca9eba7 100644 --- a/transport/internet/websocket/config.pb.go +++ b/transport/internet/websocket/config.pb.go @@ -15,25 +15,34 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package -type ConnectionReuse struct { - Enable bool `protobuf:"varint,1,opt,name=enable" json:"enable,omitempty"` +type Header struct { + Key string `protobuf:"bytes,1,opt,name=key" json:"key,omitempty"` + Value string `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` } -func (m *ConnectionReuse) Reset() { *m = ConnectionReuse{} } -func (m *ConnectionReuse) String() string { return proto.CompactTextString(m) } -func (*ConnectionReuse) ProtoMessage() {} -func (*ConnectionReuse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } +func (m *Header) Reset() { *m = Header{} } +func (m *Header) String() string { return proto.CompactTextString(m) } +func (*Header) ProtoMessage() {} +func (*Header) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } -func (m *ConnectionReuse) GetEnable() bool { +func (m *Header) GetKey() string { if m != nil { - return m.Enable + return m.Key } - return false + return "" +} + +func (m *Header) GetValue() string { + if m != nil { + return m.Value + } + return "" } type Config struct { // URL path to the WebSocket service. Empty value means root(/). - Path string `protobuf:"bytes,2,opt,name=path" json:"path,omitempty"` + Path string `protobuf:"bytes,2,opt,name=path" json:"path,omitempty"` + Header []*Header `protobuf:"bytes,3,rep,name=header" json:"header,omitempty"` } func (m *Config) Reset() { *m = Config{} } @@ -48,8 +57,15 @@ func (m *Config) GetPath() string { return "" } +func (m *Config) GetHeader() []*Header { + if m != nil { + return m.Header + } + return nil +} + func init() { - proto.RegisterType((*ConnectionReuse)(nil), "v2ray.core.transport.internet.websocket.ConnectionReuse") + proto.RegisterType((*Header)(nil), "v2ray.core.transport.internet.websocket.Header") proto.RegisterType((*Config)(nil), "v2ray.core.transport.internet.websocket.Config") } @@ -58,18 +74,20 @@ func init() { } var fileDescriptor0 = []byte{ - // 204 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0xcf, 0x31, 0x4b, 0xc7, 0x30, - 0x10, 0x05, 0x70, 0x52, 0xfe, 0x94, 0x36, 0x8b, 0x92, 0x41, 0x3a, 0x96, 0x2e, 0xad, 0x08, 0x09, - 0xd4, 0xc5, 0xd9, 0x4e, 0x3a, 0x49, 0x10, 0x05, 0xb7, 0x34, 0x9e, 0x5a, 0xb4, 0x77, 0x25, 0x3d, - 0x95, 0x7e, 0x25, 0x3f, 0xa5, 0x58, 0x4c, 0xe6, 0xff, 0x76, 0x0f, 0xee, 0xc7, 0xe3, 0xc9, 0xab, - 0xaf, 0x3e, 0xb8, 0x4d, 0x7b, 0x9a, 0x8d, 0xa7, 0x00, 0x86, 0x83, 0xc3, 0x75, 0xa1, 0xc0, 0x66, - 0x42, 0x86, 0x80, 0xc0, 0xe6, 0x1b, 0xc6, 0x95, 0xfc, 0x3b, 0xb0, 0xf1, 0x84, 0x2f, 0xd3, 0xab, - 0x5e, 0x02, 0x31, 0xa9, 0x36, 0xca, 0x00, 0x3a, 0x29, 0x1d, 0x95, 0x4e, 0xaa, 0x39, 0x97, 0x27, - 0x03, 0x21, 0x82, 0xe7, 0x89, 0xd0, 0xc2, 0xe7, 0x0a, 0xea, 0x4c, 0xe6, 0x80, 0x6e, 0xfc, 0x80, - 0x4a, 0xd4, 0xa2, 0x2b, 0xec, 0x7f, 0x6a, 0x1a, 0x99, 0x0f, 0x7b, 0x87, 0x52, 0xf2, 0xb0, 0x38, - 0x7e, 0xab, 0xb2, 0x5a, 0x74, 0xa5, 0xdd, 0xef, 0xdb, 0x43, 0x21, 0x4e, 0xb3, 0xeb, 0x67, 0x79, - 0xe1, 0x69, 0xd6, 0x47, 0xb6, 0xdf, 0x89, 0xa7, 0x32, 0x85, 0x9f, 0xac, 0x7d, 0xe8, 0xad, 0xdb, - 0xf4, 0xf0, 0xc7, 0xee, 0x13, 0xbb, 0x89, 0xec, 0x31, 0x7e, 0x8e, 0xf9, 0x3e, 0xf2, 0xf2, 0x37, - 0x00, 0x00, 0xff, 0xff, 0x7a, 0xf3, 0x2b, 0x77, 0x20, 0x01, 0x00, 0x00, + // 229 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xb2, 0x28, 0x33, 0x2a, 0x4a, + 0xac, 0xd4, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0x2f, 0x4a, 0xd5, 0x2f, 0x29, 0x4a, 0xcc, 0x2b, + 0x2e, 0xc8, 0x2f, 0x2a, 0xd1, 0xcf, 0xcc, 0x2b, 0x49, 0x2d, 0xca, 0x4b, 0x2d, 0xd1, 0x2f, 0x4f, + 0x4d, 0x2a, 0xce, 0x4f, 0xce, 0x4e, 0x2d, 0xd1, 0x4f, 0xce, 0xcf, 0x4b, 0xcb, 0x4c, 0xd7, 0x2b, + 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x52, 0x87, 0xe9, 0x2c, 0x4a, 0xd5, 0x83, 0xeb, 0xd2, 0x83, 0xe9, + 0xd2, 0x83, 0xeb, 0x52, 0x32, 0xe0, 0x62, 0xf3, 0x48, 0x4d, 0x4c, 0x49, 0x2d, 0x12, 0x12, 0xe0, + 0x62, 0xce, 0x4e, 0xad, 0x94, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x0c, 0x02, 0x31, 0x85, 0x44, 0xb8, + 0x58, 0xcb, 0x12, 0x73, 0x4a, 0x53, 0x25, 0x98, 0xc0, 0x62, 0x10, 0x8e, 0x52, 0x36, 0x17, 0x9b, + 0x33, 0xd8, 0x2a, 0x21, 0x21, 0x2e, 0x96, 0x82, 0xc4, 0x92, 0x0c, 0xa8, 0x34, 0x98, 0x2d, 0xe4, + 0xce, 0xc5, 0x96, 0x01, 0x36, 0x4f, 0x82, 0x59, 0x81, 0x59, 0x83, 0xdb, 0x48, 0x5f, 0x8f, 0x48, + 0x97, 0xe8, 0x41, 0x9c, 0x11, 0x04, 0xd5, 0xee, 0xc5, 0xc2, 0xc1, 0x28, 0xc0, 0xe4, 0x94, 0xc2, + 0xa5, 0x9d, 0x9c, 0x9f, 0x4b, 0xac, 0x19, 0x01, 0x8c, 0x51, 0x9c, 0x70, 0xce, 0x2a, 0x26, 0xf5, + 0x30, 0xa3, 0xa0, 0xc4, 0x4a, 0x3d, 0x67, 0x90, 0xb6, 0x10, 0xb8, 0x36, 0x4f, 0x98, 0xb6, 0x70, + 0x98, 0xca, 0x24, 0x36, 0x70, 0xa0, 0x19, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0xf5, 0x7e, 0x60, + 0xf9, 0x70, 0x01, 0x00, 0x00, } diff --git a/transport/internet/websocket/config.proto b/transport/internet/websocket/config.proto index ebf47dbf..6e36467d 100644 --- a/transport/internet/websocket/config.proto +++ b/transport/internet/websocket/config.proto @@ -6,8 +6,9 @@ option go_package = "websocket"; option java_package = "com.v2ray.core.transport.internet.websocket"; option java_multiple_files = true; -message ConnectionReuse { - bool enable = 1; +message Header { + string key = 1; + string value = 2; } message Config { @@ -15,4 +16,6 @@ message Config { // URL path to the WebSocket service. Empty value means root(/). string path = 2; + + repeated Header header = 3; } \ No newline at end of file diff --git a/transport/internet/websocket/dialer.go b/transport/internet/websocket/dialer.go index b3cf9824..af3cd9e3 100644 --- a/transport/internet/websocket/dialer.go +++ b/transport/internet/websocket/dialer.go @@ -59,7 +59,7 @@ func dialWebsocket(ctx context.Context, dest net.Destination) (net.Conn, error) } uri := protocol + "://" + host + wsSettings.GetNormailzedPath() - conn, resp, err := dialer.Dial(uri, nil) + conn, resp, err := dialer.Dial(uri, wsSettings.GetRequestHeader()) if err != nil { var reason string if resp != nil { From 3809f4f25a67b7abc6088bd653c5e4a94dcf4ebd Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sat, 14 Oct 2017 01:33:09 +0800 Subject: [PATCH 005/229] specify server name in tls --- tools/release/config/vpoint_socks_vmess.json | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/release/config/vpoint_socks_vmess.json b/tools/release/config/vpoint_socks_vmess.json index 28a13df1..51863a67 100644 --- a/tools/release/config/vpoint_socks_vmess.json +++ b/tools/release/config/vpoint_socks_vmess.json @@ -36,6 +36,7 @@ "network": "ws", "security": "tls", "tlsSettings": { + "serverName": "v2ray.cool", "allowInsecure": true }, "wsSettings": { From 97d300ad1596a582e28b9695bb1447fb1a1233ca Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 15 Oct 2017 00:46:28 +0800 Subject: [PATCH 006/229] Update version --- core.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core.go b/core.go index f8c04ae0..50d1e0da 100644 --- a/core.go +++ b/core.go @@ -18,7 +18,7 @@ import ( ) var ( - version = "2.41" + version = "2.42" build = "Custom" codename = "One for all" intro = "An unified platform for anti-censorship." From 95c469c1fd4b7b1b840bcef40cb759596b1290aa Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 20 Oct 2017 21:11:13 +0200 Subject: [PATCH 007/229] handle proxy error in mux client --- app/proxyman/mux/mux.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/proxyman/mux/mux.go b/app/proxyman/mux/mux.go index 39e7a825..5425416d 100644 --- a/app/proxyman/mux/mux.go +++ b/app/proxyman/mux/mux.go @@ -90,7 +90,14 @@ func NewClient(p proxy.Outbound, dialer proxy.Dialer, m *ClientManager) (*Client ctx, cancel := context.WithCancel(context.Background()) ctx = proxy.ContextWithTarget(ctx, net.TCPDestination(muxCoolAddress, muxCoolPort)) pipe := ray.NewRay(ctx) - go p.Process(ctx, pipe, dialer) + + go func() { + if err := p.Process(ctx, pipe, dialer); err != nil { + cancel() + log.Trace(errors.New("failed to handler mux client connection").Base(err).AtWarning()) + } + }() + c := &Client{ sessionManager: NewSessionManager(), inboundRay: pipe, From 60f3562ac17380f4c64669b263436a18db360049 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 20 Oct 2017 22:45:14 +0200 Subject: [PATCH 008/229] simplify websocket dialer and hub --- transport/internet/websocket/connection.go | 6 ++++++ transport/internet/websocket/dialer.go | 16 +++++++------- transport/internet/websocket/hub.go | 25 ++++++++-------------- 3 files changed, 23 insertions(+), 24 deletions(-) diff --git a/transport/internet/websocket/connection.go b/transport/internet/websocket/connection.go index 5b7db36d..2009db7c 100644 --- a/transport/internet/websocket/connection.go +++ b/transport/internet/websocket/connection.go @@ -24,6 +24,12 @@ type connection struct { mergingWriter buf.Writer } +func newConnection(conn *websocket.Conn) *connection { + return &connection{ + wsc: conn, + } +} + // Read implements net.Conn.Read() func (c *connection) Read(b []byte) (int, error) { for { diff --git a/transport/internet/websocket/dialer.go b/transport/internet/websocket/dialer.go index af3cd9e3..cdeb9565 100644 --- a/transport/internet/websocket/dialer.go +++ b/transport/internet/websocket/dialer.go @@ -2,6 +2,7 @@ package websocket import ( "context" + "time" "github.com/gorilla/websocket" "v2ray.com/core/app/log" @@ -30,14 +31,13 @@ func dialWebsocket(ctx context.Context, dest net.Destination) (net.Conn, error) src := internet.DialerSourceFromContext(ctx) wsSettings := internet.TransportSettingsFromContext(ctx).(*Config) - commonDial := func(network, addr string) (net.Conn, error) { - return internet.DialSystem(ctx, src, dest) - } - - dialer := websocket.Dialer{ - NetDial: commonDial, - ReadBufferSize: 32 * 1024, - WriteBufferSize: 32 * 1024, + dialer := &websocket.Dialer{ + NetDial: func(network, addr string) (net.Conn, error) { + return internet.DialSystem(ctx, src, dest) + }, + ReadBufferSize: 32 * 1024, + WriteBufferSize: 32 * 1024, + HandshakeTimeout: time.Second * 8, } protocol := "ws" diff --git a/transport/internet/websocket/hub.go b/transport/internet/websocket/hub.go index b67257e3..9183688d 100644 --- a/transport/internet/websocket/hub.go +++ b/transport/internet/websocket/hub.go @@ -6,6 +6,7 @@ import ( "net/http" "strconv" "sync" + "time" "github.com/gorilla/websocket" "v2ray.com/core/app/log" @@ -20,18 +21,24 @@ type requestHandler struct { ln *Listener } +var upgrader = &websocket.Upgrader{ + ReadBufferSize: 32 * 1024, + WriteBufferSize: 32 * 1024, + HandshakeTimeout: time.Second * 8, +} + func (h *requestHandler) ServeHTTP(writer http.ResponseWriter, request *http.Request) { if request.URL.Path != h.path { writer.WriteHeader(http.StatusNotFound) return } - conn, err := converttovws(writer, request) + conn, err := upgrader.Upgrade(writer, request, nil) if err != nil { log.Trace(newError("failed to convert to WebSocket connection").Base(err)) return } - h.ln.addConn(h.ln.ctx, internet.Connection(conn)) + h.ln.addConn(h.ln.ctx, newConnection(conn)) } type Listener struct { @@ -92,20 +99,6 @@ func (ln *Listener) listenws(address net.Address, port net.Port) error { return nil } -func converttovws(w http.ResponseWriter, r *http.Request) (*connection, error) { - var upgrader = websocket.Upgrader{ - ReadBufferSize: 32 * 1024, - WriteBufferSize: 32 * 1024, - } - conn, err := upgrader.Upgrade(w, r, nil) - - if err != nil { - return nil, err - } - - return &connection{wsc: conn}, nil -} - func (ln *Listener) Addr() net.Addr { return ln.listener.Addr() } From 5ae8bfbda16461d565acf9ad8eba0708936f8f64 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 20 Oct 2017 23:23:29 +0200 Subject: [PATCH 009/229] fix data race in ray --- transport/ray/direct.go | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/transport/ray/direct.go b/transport/ray/direct.go index 3fcea2c8..f9406f8e 100644 --- a/transport/ray/direct.go +++ b/transport/ray/direct.go @@ -143,26 +143,38 @@ func (s *Stream) ReadTimeout(timeout time.Duration) (buf.MultiBuffer, error) { } } -func (s *Stream) Write(data buf.MultiBuffer) error { - if data.IsEmpty() { +func (s *Stream) waitForStreamSize() error { + if streamSizeLimit == 0 { return nil } + s.access.RLock() + defer s.access.RUnlock() + for streamSizeLimit > 0 && s.size >= streamSizeLimit { select { case <-s.ctx.Done(): return io.ErrClosedPipe case <-s.readSignal: - s.access.RLock() if s.err || s.close { - data.Release() - s.access.RUnlock() return io.ErrClosedPipe } - s.access.RUnlock() } } + return nil +} + +func (s *Stream) Write(data buf.MultiBuffer) error { + if data.IsEmpty() { + return nil + } + + if err := s.waitForStreamSize(); err != nil { + data.Release() + return err + } + s.access.Lock() defer s.access.Unlock() From 2a04819582c64071c46c765df8a71691cc230994 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 20 Oct 2017 23:30:14 +0200 Subject: [PATCH 010/229] fix data race in kcp connection --- transport/internet/kcp/receiving.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/transport/internet/kcp/receiving.go b/transport/internet/kcp/receiving.go index 7c10dad5..5024628b 100644 --- a/transport/internet/kcp/receiving.go +++ b/transport/internet/kcp/receiving.go @@ -256,7 +256,7 @@ func (v *ReceivingWorker) Write(seg Segment) error { ackSeg.Conv = v.conn.conv ackSeg.ReceivingNext = v.nextNumber ackSeg.ReceivingWindow = v.nextNumber + v.windowSize - if v.conn.state == StateReadyToClose { + if v.conn.State() == StateReadyToClose { ackSeg.Option = SegmentOptionClose } return v.conn.output.Write(ackSeg) From 85a544d671be739732d43114a4d2f05dc6a628ef Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 20 Oct 2017 23:30:36 +0200 Subject: [PATCH 011/229] avoid unnecessary data race error in test cases --- testing/scenarios/dokodemo_test.go | 22 ++-- testing/scenarios/shadowsocks_test.go | 60 ++++----- testing/scenarios/vmess_test.go | 182 +++++++++++++------------- 3 files changed, 132 insertions(+), 132 deletions(-) diff --git a/testing/scenarios/dokodemo_test.go b/testing/scenarios/dokodemo_test.go index a1b07f61..0c88d0eb 100644 --- a/testing/scenarios/dokodemo_test.go +++ b/testing/scenarios/dokodemo_test.go @@ -33,6 +33,12 @@ func TestDokodemoTCP(t *testing.T) { userID := protocol.NewID(uuid.New()) serverPort := pickPort() serverConfig := &core.Config{ + App: []*serial.TypedMessage{ + serial.ToTypedMessage(&log.Config{ + ErrorLogLevel: log.LogLevel_Debug, + ErrorLogType: log.LogType_Console, + }), + }, Inbound: []*proxyman.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ @@ -55,17 +61,17 @@ func TestDokodemoTCP(t *testing.T) { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, + } + + clientPort := uint32(pickPort()) + clientPortRange := uint32(5) + clientConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: log.LogLevel_Debug, ErrorLogType: log.LogType_Console, }), }, - } - - clientPort := uint32(pickPort()) - clientPortRange := uint32(5) - clientConfig := &core.Config{ Inbound: []*proxyman.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ @@ -100,12 +106,6 @@ func TestDokodemoTCP(t *testing.T) { }), }, }, - App: []*serial.TypedMessage{ - serial.ToTypedMessage(&log.Config{ - ErrorLogLevel: log.LogLevel_Debug, - ErrorLogType: log.LogType_Console, - }), - }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) diff --git a/testing/scenarios/shadowsocks_test.go b/testing/scenarios/shadowsocks_test.go index 73a9a31e..3bfd948c 100644 --- a/testing/scenarios/shadowsocks_test.go +++ b/testing/scenarios/shadowsocks_test.go @@ -38,6 +38,12 @@ func TestShadowsocksAES256TCP(t *testing.T) { serverPort := pickPort() serverConfig := &core.Config{ + App: []*serial.TypedMessage{ + serial.ToTypedMessage(&log.Config{ + ErrorLogLevel: log.LogLevel_Debug, + ErrorLogType: log.LogType_Console, + }), + }, Inbound: []*proxyman.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ @@ -57,16 +63,16 @@ func TestShadowsocksAES256TCP(t *testing.T) { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, + } + + clientPort := pickPort() + clientConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: log.LogLevel_Debug, ErrorLogType: log.LogType_Console, }), }, - } - - clientPort := pickPort() - clientConfig := &core.Config{ Inbound: []*proxyman.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ @@ -99,12 +105,6 @@ func TestShadowsocksAES256TCP(t *testing.T) { }), }, }, - App: []*serial.TypedMessage{ - serial.ToTypedMessage(&log.Config{ - ErrorLogLevel: log.LogLevel_Debug, - ErrorLogType: log.LogType_Console, - }), - }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) @@ -156,6 +156,12 @@ func TestShadowsocksAES128UDP(t *testing.T) { serverPort := pickPort() serverConfig := &core.Config{ + App: []*serial.TypedMessage{ + serial.ToTypedMessage(&log.Config{ + ErrorLogLevel: log.LogLevel_Debug, + ErrorLogType: log.LogType_Console, + }), + }, Inbound: []*proxyman.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ @@ -176,16 +182,16 @@ func TestShadowsocksAES128UDP(t *testing.T) { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, + } + + clientPort := pickPort() + clientConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: log.LogLevel_Debug, ErrorLogType: log.LogType_Console, }), }, - } - - clientPort := pickPort() - clientConfig := &core.Config{ Inbound: []*proxyman.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ @@ -218,12 +224,6 @@ func TestShadowsocksAES128UDP(t *testing.T) { }), }, }, - App: []*serial.TypedMessage{ - serial.ToTypedMessage(&log.Config{ - ErrorLogLevel: log.LogLevel_Debug, - ErrorLogType: log.LogType_Console, - }), - }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) @@ -275,6 +275,12 @@ func TestShadowsocksChacha20TCP(t *testing.T) { serverPort := pickPort() serverConfig := &core.Config{ + App: []*serial.TypedMessage{ + serial.ToTypedMessage(&log.Config{ + ErrorLogLevel: log.LogLevel_Debug, + ErrorLogType: log.LogType_Console, + }), + }, Inbound: []*proxyman.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ @@ -294,16 +300,16 @@ func TestShadowsocksChacha20TCP(t *testing.T) { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, + } + + clientPort := pickPort() + clientConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: log.LogLevel_Debug, ErrorLogType: log.LogType_Console, }), }, - } - - clientPort := pickPort() - clientConfig := &core.Config{ Inbound: []*proxyman.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ @@ -336,12 +342,6 @@ func TestShadowsocksChacha20TCP(t *testing.T) { }), }, }, - App: []*serial.TypedMessage{ - serial.ToTypedMessage(&log.Config{ - ErrorLogLevel: log.LogLevel_Debug, - ErrorLogType: log.LogType_Console, - }), - }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) diff --git a/testing/scenarios/vmess_test.go b/testing/scenarios/vmess_test.go index 1334ce2b..80a53fbf 100644 --- a/testing/scenarios/vmess_test.go +++ b/testing/scenarios/vmess_test.go @@ -37,6 +37,12 @@ func TestVMessDynamicPort(t *testing.T) { userID := protocol.NewID(uuid.New()) serverPort := pickPort() serverConfig := &core.Config{ + App: []*serial.TypedMessage{ + serial.ToTypedMessage(&log.Config{ + ErrorLogLevel: log.LogLevel_Debug, + ErrorLogType: log.LogType_Console, + }), + }, Inbound: []*proxyman.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ @@ -82,16 +88,16 @@ func TestVMessDynamicPort(t *testing.T) { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, + } + + clientPort := pickPort() + clientConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: log.LogLevel_Debug, ErrorLogType: log.LogType_Console, }), }, - } - - clientPort := pickPort() - clientConfig := &core.Config{ Inbound: []*proxyman.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ @@ -126,12 +132,6 @@ func TestVMessDynamicPort(t *testing.T) { }), }, }, - App: []*serial.TypedMessage{ - serial.ToTypedMessage(&log.Config{ - ErrorLogLevel: log.LogLevel_Debug, - ErrorLogType: log.LogType_Console, - }), - }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) @@ -172,6 +172,12 @@ func TestVMessGCM(t *testing.T) { userID := protocol.NewID(uuid.New()) serverPort := pickPort() serverConfig := &core.Config{ + App: []*serial.TypedMessage{ + serial.ToTypedMessage(&log.Config{ + ErrorLogLevel: log.LogLevel_Debug, + ErrorLogType: log.LogType_Console, + }), + }, Inbound: []*proxyman.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ @@ -195,16 +201,16 @@ func TestVMessGCM(t *testing.T) { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, + } + + clientPort := pickPort() + clientConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: log.LogLevel_Debug, ErrorLogType: log.LogType_Console, }), }, - } - - clientPort := pickPort() - clientConfig := &core.Config{ Inbound: []*proxyman.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ @@ -243,12 +249,6 @@ func TestVMessGCM(t *testing.T) { }), }, }, - App: []*serial.TypedMessage{ - serial.ToTypedMessage(&log.Config{ - ErrorLogLevel: log.LogLevel_Debug, - ErrorLogType: log.LogType_Console, - }), - }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) @@ -295,6 +295,12 @@ func TestVMessGCMUDP(t *testing.T) { userID := protocol.NewID(uuid.New()) serverPort := pickPort() serverConfig := &core.Config{ + App: []*serial.TypedMessage{ + serial.ToTypedMessage(&log.Config{ + ErrorLogLevel: log.LogLevel_Debug, + ErrorLogType: log.LogType_Console, + }), + }, Inbound: []*proxyman.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ @@ -318,16 +324,16 @@ func TestVMessGCMUDP(t *testing.T) { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, + } + + clientPort := pickPort() + clientConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: log.LogLevel_Debug, ErrorLogType: log.LogType_Console, }), }, - } - - clientPort := pickPort() - clientConfig := &core.Config{ Inbound: []*proxyman.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ @@ -366,12 +372,6 @@ func TestVMessGCMUDP(t *testing.T) { }), }, }, - App: []*serial.TypedMessage{ - serial.ToTypedMessage(&log.Config{ - ErrorLogLevel: log.LogLevel_Debug, - ErrorLogType: log.LogType_Console, - }), - }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) @@ -428,6 +428,12 @@ func TestVMessChacha20(t *testing.T) { userID := protocol.NewID(uuid.New()) serverPort := pickPort() serverConfig := &core.Config{ + App: []*serial.TypedMessage{ + serial.ToTypedMessage(&log.Config{ + ErrorLogLevel: log.LogLevel_Debug, + ErrorLogType: log.LogType_Console, + }), + }, Inbound: []*proxyman.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ @@ -451,16 +457,16 @@ func TestVMessChacha20(t *testing.T) { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, + } + + clientPort := pickPort() + clientConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: log.LogLevel_Debug, ErrorLogType: log.LogType_Console, }), }, - } - - clientPort := pickPort() - clientConfig := &core.Config{ Inbound: []*proxyman.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ @@ -499,12 +505,6 @@ func TestVMessChacha20(t *testing.T) { }), }, }, - App: []*serial.TypedMessage{ - serial.ToTypedMessage(&log.Config{ - ErrorLogLevel: log.LogLevel_Debug, - ErrorLogType: log.LogType_Console, - }), - }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) @@ -551,6 +551,12 @@ func TestVMessNone(t *testing.T) { userID := protocol.NewID(uuid.New()) serverPort := pickPort() serverConfig := &core.Config{ + App: []*serial.TypedMessage{ + serial.ToTypedMessage(&log.Config{ + ErrorLogLevel: log.LogLevel_Debug, + ErrorLogType: log.LogType_Console, + }), + }, Inbound: []*proxyman.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ @@ -574,16 +580,16 @@ func TestVMessNone(t *testing.T) { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, + } + + clientPort := pickPort() + clientConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: log.LogLevel_Debug, ErrorLogType: log.LogType_Console, }), }, - } - - clientPort := pickPort() - clientConfig := &core.Config{ Inbound: []*proxyman.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ @@ -622,12 +628,6 @@ func TestVMessNone(t *testing.T) { }), }, }, - App: []*serial.TypedMessage{ - serial.ToTypedMessage(&log.Config{ - ErrorLogLevel: log.LogLevel_Debug, - ErrorLogType: log.LogType_Console, - }), - }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) @@ -674,6 +674,12 @@ func TestVMessKCP(t *testing.T) { userID := protocol.NewID(uuid.New()) serverPort := pickUDPPort() serverConfig := &core.Config{ + App: []*serial.TypedMessage{ + serial.ToTypedMessage(&log.Config{ + ErrorLogLevel: log.LogLevel_Debug, + ErrorLogType: log.LogType_Console, + }), + }, Inbound: []*proxyman.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ @@ -700,16 +706,16 @@ func TestVMessKCP(t *testing.T) { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, + } + + clientPort := pickPort() + clientConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: log.LogLevel_Debug, ErrorLogType: log.LogType_Console, }), }, - } - - clientPort := pickPort() - clientConfig := &core.Config{ Inbound: []*proxyman.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ @@ -753,12 +759,6 @@ func TestVMessKCP(t *testing.T) { }), }, }, - App: []*serial.TypedMessage{ - serial.ToTypedMessage(&log.Config{ - ErrorLogLevel: log.LogLevel_Debug, - ErrorLogType: log.LogType_Console, - }), - }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) @@ -807,6 +807,12 @@ func TestVMessIPv6(t *testing.T) { userID := protocol.NewID(uuid.New()) serverPort := pickPort() serverConfig := &core.Config{ + App: []*serial.TypedMessage{ + serial.ToTypedMessage(&log.Config{ + ErrorLogLevel: log.LogLevel_Debug, + ErrorLogType: log.LogType_Console, + }), + }, Inbound: []*proxyman.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ @@ -830,16 +836,16 @@ func TestVMessIPv6(t *testing.T) { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, + } + + clientPort := pickPort() + clientConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: log.LogLevel_Debug, ErrorLogType: log.LogType_Console, }), }, - } - - clientPort := pickPort() - clientConfig := &core.Config{ Inbound: []*proxyman.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ @@ -878,12 +884,6 @@ func TestVMessIPv6(t *testing.T) { }), }, }, - App: []*serial.TypedMessage{ - serial.ToTypedMessage(&log.Config{ - ErrorLogLevel: log.LogLevel_Debug, - ErrorLogType: log.LogType_Console, - }), - }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) @@ -922,6 +922,12 @@ func TestVMessGCMMux(t *testing.T) { userID := protocol.NewID(uuid.New()) serverPort := pickPort() serverConfig := &core.Config{ + App: []*serial.TypedMessage{ + serial.ToTypedMessage(&log.Config{ + ErrorLogLevel: log.LogLevel_Debug, + ErrorLogType: log.LogType_Console, + }), + }, Inbound: []*proxyman.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ @@ -945,16 +951,16 @@ func TestVMessGCMMux(t *testing.T) { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, + } + + clientPort := pickPort() + clientConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: log.LogLevel_Debug, ErrorLogType: log.LogType_Console, }), }, - } - - clientPort := pickPort() - clientConfig := &core.Config{ Inbound: []*proxyman.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ @@ -999,12 +1005,6 @@ func TestVMessGCMMux(t *testing.T) { }), }, }, - App: []*serial.TypedMessage{ - serial.ToTypedMessage(&log.Config{ - ErrorLogLevel: log.LogLevel_Debug, - ErrorLogType: log.LogType_Console, - }), - }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) @@ -1064,6 +1064,12 @@ func TestVMessGCMMuxUDP(t *testing.T) { userID := protocol.NewID(uuid.New()) serverPort := pickPort() serverConfig := &core.Config{ + App: []*serial.TypedMessage{ + serial.ToTypedMessage(&log.Config{ + ErrorLogLevel: log.LogLevel_Debug, + ErrorLogType: log.LogType_Console, + }), + }, Inbound: []*proxyman.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ @@ -1087,17 +1093,17 @@ func TestVMessGCMMuxUDP(t *testing.T) { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, + } + + clientPort := pickPort() + clientUDPPort := pickUDPPort() + clientConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: log.LogLevel_Debug, ErrorLogType: log.LogType_Console, }), }, - } - - clientPort := pickPort() - clientUDPPort := pickUDPPort() - clientConfig := &core.Config{ Inbound: []*proxyman.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ @@ -1155,12 +1161,6 @@ func TestVMessGCMMuxUDP(t *testing.T) { }), }, }, - App: []*serial.TypedMessage{ - serial.ToTypedMessage(&log.Config{ - ErrorLogLevel: log.LogLevel_Debug, - ErrorLogType: log.LogType_Console, - }), - }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) From 1c29d1535cf993a3cbeff56d575f062dfe89063c Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 20 Oct 2017 23:36:14 +0200 Subject: [PATCH 012/229] fix data race in tcp server --- testing/servers/tcp/tcp.go | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/testing/servers/tcp/tcp.go b/testing/servers/tcp/tcp.go index 8117318d..48c819c0 100644 --- a/testing/servers/tcp/tcp.go +++ b/testing/servers/tcp/tcp.go @@ -12,7 +12,6 @@ type Server struct { MsgProcessor func(msg []byte) []byte SendFirst []byte Listen net.Address - accepting bool listener *net.TCPListener } @@ -37,12 +36,11 @@ func (server *Server) Start() (net.Destination, error) { } func (server *Server) acceptConnections(listener *net.TCPListener) { - server.accepting = true - for server.accepting { + for { conn, err := listener.Accept() if err != nil { fmt.Printf("Failed accept TCP connection: %v\n", err) - continue + return } go server.handleConnection(conn) @@ -71,7 +69,6 @@ func (server *Server) handleConnection(conn net.Conn) { conn.Close() } -func (v *Server) Close() { - v.accepting = false - v.listener.Close() +func (server *Server) Close() { + server.listener.Close() } From afe190316db689421710d158b70106779280c02b Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 20 Oct 2017 23:54:07 +0200 Subject: [PATCH 013/229] fail fast --- testing/assert/assert.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/testing/assert/assert.go b/testing/assert/assert.go index 3e8a1849..fd9a9ec5 100644 --- a/testing/assert/assert.go +++ b/testing/assert/assert.go @@ -19,8 +19,7 @@ type Assert struct { } func (v *Assert) Fail(message string) { - fmt.Println(decorate(message)) - v.t.Fail() + v.t.Fatal(decorate(message)) } func getCaller() (string, int) { From 6dd23b45b056ea63f5919e6073ac9db6108eeab4 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sat, 21 Oct 2017 09:45:27 +0200 Subject: [PATCH 014/229] fix lint warnings for websocket --- transport/internet/websocket/connection.go | 20 ++++++++++---------- transport/internet/websocket/dialer.go | 4 +--- transport/internet/websocket/hub.go | 7 ++++++- transport/internet/websocket/ws_test.go | 5 +++-- 4 files changed, 20 insertions(+), 16 deletions(-) diff --git a/transport/internet/websocket/connection.go b/transport/internet/websocket/connection.go index 2009db7c..123621aa 100644 --- a/transport/internet/websocket/connection.go +++ b/transport/internet/websocket/connection.go @@ -17,7 +17,7 @@ var ( // connection is a wrapper for net.Conn over WebSocket connection. type connection struct { - wsc *websocket.Conn + conn *websocket.Conn reader io.Reader mergingReader buf.Reader @@ -26,7 +26,7 @@ type connection struct { func newConnection(conn *websocket.Conn) *connection { return &connection{ - wsc: conn, + conn: conn, } } @@ -59,7 +59,7 @@ func (c *connection) getReader() (io.Reader, error) { return c.reader, nil } - _, reader, err := c.wsc.NextReader() + _, reader, err := c.conn.NextReader() if err != nil { return nil, err } @@ -69,7 +69,7 @@ func (c *connection) getReader() (io.Reader, error) { // Write implements io.Writer. func (c *connection) Write(b []byte) (int, error) { - if err := c.wsc.WriteMessage(websocket.BinaryMessage, b); err != nil { + if err := c.conn.WriteMessage(websocket.BinaryMessage, b); err != nil { return 0, err } return len(b), nil @@ -83,16 +83,16 @@ func (c *connection) WriteMultiBuffer(mb buf.MultiBuffer) error { } func (c *connection) Close() error { - c.wsc.WriteControl(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""), time.Now().Add(time.Second*5)) - return c.wsc.Close() + c.conn.WriteControl(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""), time.Now().Add(time.Second*5)) + return c.conn.Close() } func (c *connection) LocalAddr() net.Addr { - return c.wsc.LocalAddr() + return c.conn.LocalAddr() } func (c *connection) RemoteAddr() net.Addr { - return c.wsc.RemoteAddr() + return c.conn.RemoteAddr() } func (c *connection) SetDeadline(t time.Time) error { @@ -103,9 +103,9 @@ func (c *connection) SetDeadline(t time.Time) error { } func (c *connection) SetReadDeadline(t time.Time) error { - return c.wsc.SetReadDeadline(t) + return c.conn.SetReadDeadline(t) } func (c *connection) SetWriteDeadline(t time.Time) error { - return c.wsc.SetWriteDeadline(t) + return c.conn.SetWriteDeadline(t) } diff --git a/transport/internet/websocket/dialer.go b/transport/internet/websocket/dialer.go index cdeb9565..c42c4c9a 100644 --- a/transport/internet/websocket/dialer.go +++ b/transport/internet/websocket/dialer.go @@ -68,7 +68,5 @@ func dialWebsocket(ctx context.Context, dest net.Destination) (net.Conn, error) return nil, newError("failed to dial to (", uri, "): ", reason).Base(err) } - return &connection{ - wsc: conn, - }, nil + return newConnection(conn), nil } diff --git a/transport/internet/websocket/hub.go b/transport/internet/websocket/hub.go index 9183688d..048df815 100644 --- a/transport/internet/websocket/hub.go +++ b/transport/internet/websocket/hub.go @@ -90,19 +90,24 @@ func (ln *Listener) listenws(address net.Address, port net.Port) error { ln.listener = listener go func() { - http.Serve(listener, &requestHandler{ + err := http.Serve(listener, &requestHandler{ path: ln.config.GetNormailzedPath(), ln: ln, }) + if err != nil { + log.Trace(newError("failed to serve http for WebSocket").Base(err).AtWarning()) + } }() return nil } +// Addr implements net.Listener.Addr(). func (ln *Listener) Addr() net.Addr { return ln.listener.Addr() } +// Close implements net.Listener.Close(). func (ln *Listener) Close() error { return ln.listener.Close() } diff --git a/transport/internet/websocket/ws_test.go b/transport/internet/websocket/ws_test.go index 2501f5ad..49746ed2 100644 --- a/transport/internet/websocket/ws_test.go +++ b/transport/internet/websocket/ws_test.go @@ -6,6 +6,7 @@ import ( "testing" "time" + "v2ray.com/core/common" "v2ray.com/core/common/net" "v2ray.com/core/testing/assert" tlsgen "v2ray.com/core/testing/tls" @@ -88,7 +89,7 @@ func Test_listenWSAndDial_TLS(t *testing.T) { }) listen, err := ListenWS(ctx, net.DomainAddress("localhost"), 13143, func(ctx context.Context, conn internet.Connection) bool { go func() { - conn.Close() + common.Must(conn.Close()) }() return true }) @@ -97,5 +98,5 @@ func Test_listenWSAndDial_TLS(t *testing.T) { conn, err := Dial(ctx, net.TCPDestination(net.DomainAddress("localhost"), 13143)) assert.Error(err).IsNil() - conn.Close() + common.Must(conn.Close()) } From 103cb486924c0017a7e66035d4305f9f32e257da Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sat, 21 Oct 2017 19:26:57 +0200 Subject: [PATCH 015/229] test case for SessionManager.Size() --- app/proxyman/mux/session_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/proxyman/mux/session_test.go b/app/proxyman/mux/session_test.go index addff874..63953ecf 100644 --- a/app/proxyman/mux/session_test.go +++ b/app/proxyman/mux/session_test.go @@ -14,9 +14,11 @@ func TestSessionManagerAdd(t *testing.T) { s := m.Allocate() assert.Uint16(s.ID).Equals(1) + assert.Int(m.Size()).Equals(1) s = m.Allocate() assert.Uint16(s.ID).Equals(2) + assert.Int(m.Size()).Equals(2) s = &Session{ ID: 4, From badc77a7f755d9e6124b5a77f8b3d852921b19ca Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sat, 21 Oct 2017 19:27:20 +0200 Subject: [PATCH 016/229] return proper error in drain --- app/proxyman/mux/mux.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/proxyman/mux/mux.go b/app/proxyman/mux/mux.go index 5425416d..171aa318 100644 --- a/app/proxyman/mux/mux.go +++ b/app/proxyman/mux/mux.go @@ -187,8 +187,7 @@ func (m *Client) Dispatch(ctx context.Context, outboundRay ray.OutboundRay) bool } func drain(reader io.Reader) error { - buf.Copy(NewStreamReader(reader), buf.Discard) - return nil + return buf.Copy(NewStreamReader(reader), buf.Discard) } func (m *Client) handleStatueKeepAlive(meta *FrameMetadata, reader io.Reader) error { From 7f4296cd789e14ff0713e05947be573a290c18b5 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sat, 21 Oct 2017 19:27:31 +0200 Subject: [PATCH 017/229] assert meta is nil on error --- app/proxyman/mux/mux_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/app/proxyman/mux/mux_test.go b/app/proxyman/mux/mux_test.go index f7977cf3..4276fbbf 100644 --- a/app/proxyman/mux/mux_test.go +++ b/app/proxyman/mux/mux_test.go @@ -139,4 +139,5 @@ func TestReaderWriter(t *testing.T) { meta, err = metaReader.Read() assert.Error(err).IsNotNil() + assert.Pointer(meta).IsNil() } From aa5e06a26e80ec51fe3a638d546ecdce65f2e810 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sat, 21 Oct 2017 19:27:53 +0200 Subject: [PATCH 018/229] reduce memory consumption of frame meta --- app/proxyman/mux/frame.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/proxyman/mux/frame.go b/app/proxyman/mux/frame.go index 74cabda2..1f24dfbb 100644 --- a/app/proxyman/mux/frame.go +++ b/app/proxyman/mux/frame.go @@ -63,9 +63,9 @@ n bytes - address type FrameMetadata struct { SessionID uint16 - SessionStatus SessionStatus Target net.Destination Option Option + SessionStatus SessionStatus } func (f FrameMetadata) AsSupplier() buf.Supplier { From 9df5ac6e4f19338234a959d6f6383738f2a3f391 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sat, 21 Oct 2017 19:29:27 +0200 Subject: [PATCH 019/229] fix frame meta --- app/proxyman/mux/frame.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/proxyman/mux/frame.go b/app/proxyman/mux/frame.go index 1f24dfbb..393fa00b 100644 --- a/app/proxyman/mux/frame.go +++ b/app/proxyman/mux/frame.go @@ -62,8 +62,8 @@ n bytes - address */ type FrameMetadata struct { - SessionID uint16 Target net.Destination + SessionID uint16 Option Option SessionStatus SessionStatus } From 948534f4808cb535bd6bdfbfdacff74871cd1b3f Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sat, 21 Oct 2017 20:21:51 +0200 Subject: [PATCH 020/229] reduce memory consumption of mux.Writer --- app/proxyman/mux/writer.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/proxyman/mux/writer.go b/app/proxyman/mux/writer.go index 47c41914..07c7f081 100644 --- a/app/proxyman/mux/writer.go +++ b/app/proxyman/mux/writer.go @@ -10,9 +10,9 @@ import ( ) type Writer struct { - id uint16 dest net.Destination writer buf.Writer + id uint16 followup bool transferType protocol.TransferType } From 8c6f73f30b155375bc412d477d1a8f4d518e9cfb Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sat, 21 Oct 2017 20:40:31 +0200 Subject: [PATCH 021/229] bitmask --- app/proxyman/mux/frame.go | 21 ++++----------------- app/proxyman/mux/session.go | 1 + common/bitmask/byte.go | 21 +++++++++++++++++++++ 3 files changed, 26 insertions(+), 17 deletions(-) create mode 100644 common/bitmask/byte.go diff --git a/app/proxyman/mux/frame.go b/app/proxyman/mux/frame.go index 393fa00b..b31ffed4 100644 --- a/app/proxyman/mux/frame.go +++ b/app/proxyman/mux/frame.go @@ -1,6 +1,7 @@ package mux import ( + "v2ray.com/core/common/bitmask" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/common/serial" @@ -15,24 +16,10 @@ const ( SessionStatusKeepAlive SessionStatus = 0x04 ) -type Option byte - const ( - OptionData Option = 0x01 + OptionData bitmask.Byte = 0x01 ) -func (o Option) Has(x Option) bool { - return (o & x) == x -} - -func (o *Option) Add(x Option) { - *o = (*o | x) -} - -func (o *Option) Clear(x Option) { - *o = (*o & (^x)) -} - type TargetNetwork byte const ( @@ -64,7 +51,7 @@ n bytes - address type FrameMetadata struct { Target net.Destination SessionID uint16 - Option Option + Option bitmask.Byte SessionStatus SessionStatus } @@ -120,7 +107,7 @@ func ReadFrameFrom(b []byte) (*FrameMetadata, error) { f := &FrameMetadata{ SessionID: serial.BytesToUint16(b[:2]), SessionStatus: SessionStatus(b[2]), - Option: Option(b[3]), + Option: bitmask.Byte(b[3]), } b = b[4:] diff --git a/app/proxyman/mux/session.go b/app/proxyman/mux/session.go index 60816dd1..0cb5592e 100644 --- a/app/proxyman/mux/session.go +++ b/app/proxyman/mux/session.go @@ -122,6 +122,7 @@ type Session struct { transferType protocol.TransferType } +// Close closes all resources associated with this session. func (s *Session) Close() { s.output.Close() s.input.Close() diff --git a/common/bitmask/byte.go b/common/bitmask/byte.go new file mode 100644 index 00000000..724fd9d9 --- /dev/null +++ b/common/bitmask/byte.go @@ -0,0 +1,21 @@ +package bitmask + +// Byte is a bitmask in byte. +type Byte byte + +// Has returns true if this bitmask contains another bitmask. +func (b Byte) Has(bb Byte) bool { + return (b & bb) != 0 +} + +func (b *Byte) Add(bb Byte) { + *b |= bb +} + +func (b *Byte) Clear(bb Byte) { + *b &= ^bb +} + +func (b *Byte) Toggle(bb Byte) { + *b ^= bb +} From f1a15e92f553a59b176634999019531ca10e93da Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sat, 21 Oct 2017 21:04:24 +0200 Subject: [PATCH 022/229] apply bitmask to other packages --- app/proxyman/mux/writer.go | 2 +- common/bitmask/byte.go | 2 +- common/bitmask/byte_test.go | 27 +++++++++++++++++++++ common/protocol/headers.go | 42 ++++++--------------------------- common/protocol/headers_test.go | 34 -------------------------- proxy/shadowsocks/protocol.go | 5 ++-- proxy/vmess/encoding/client.go | 3 ++- proxy/vmess/encoding/server.go | 5 ++-- 8 files changed, 44 insertions(+), 76 deletions(-) create mode 100644 common/bitmask/byte_test.go delete mode 100644 common/protocol/headers_test.go diff --git a/app/proxyman/mux/writer.go b/app/proxyman/mux/writer.go index 07c7f081..116af25a 100644 --- a/app/proxyman/mux/writer.go +++ b/app/proxyman/mux/writer.go @@ -63,7 +63,7 @@ func (w *Writer) writeMetaOnly() error { func (w *Writer) writeData(mb buf.MultiBuffer) error { meta := w.getNextFrameMeta() - meta.Option.Add(OptionData) + meta.Option.Set(OptionData) frame := buf.New() if err := frame.AppendSupplier(meta.AsSupplier()); err != nil { diff --git a/common/bitmask/byte.go b/common/bitmask/byte.go index 724fd9d9..8dcc5c0c 100644 --- a/common/bitmask/byte.go +++ b/common/bitmask/byte.go @@ -8,7 +8,7 @@ func (b Byte) Has(bb Byte) bool { return (b & bb) != 0 } -func (b *Byte) Add(bb Byte) { +func (b *Byte) Set(bb Byte) { *b |= bb } diff --git a/common/bitmask/byte_test.go b/common/bitmask/byte_test.go new file mode 100644 index 00000000..6e7e2e8b --- /dev/null +++ b/common/bitmask/byte_test.go @@ -0,0 +1,27 @@ +package bitmask_test + +import ( + "testing" + + . "v2ray.com/core/common/bitmask" + "v2ray.com/core/testing/assert" +) + +func TestBitmaskByte(t *testing.T) { + assert := assert.On(t) + + b := Byte(0) + b.Set(Byte(1)) + assert.Bool(b.Has(1)).IsTrue() + + b.Set(Byte(2)) + assert.Bool(b.Has(2)).IsTrue() + assert.Bool(b.Has(1)).IsTrue() + + b.Clear(Byte(1)) + assert.Bool(b.Has(2)).IsTrue() + assert.Bool(b.Has(1)).IsFalse() + + b.Toggle(Byte(2)) + assert.Bool(b.Has(2)).IsFalse() +} diff --git a/common/protocol/headers.go b/common/protocol/headers.go index dd541b68..fb64ce71 100644 --- a/common/protocol/headers.go +++ b/common/protocol/headers.go @@ -3,6 +3,7 @@ package protocol import ( "runtime" + "v2ray.com/core/common/bitmask" "v2ray.com/core/common/net" "v2ray.com/core/common/uuid" ) @@ -24,31 +25,16 @@ func (c RequestCommand) TransferType() TransferType { return TransferTypePacket } -// RequestOption is the options of a request. -type RequestOption byte - const ( // RequestOptionChunkStream indicates request payload is chunked. Each chunk consists of length, authentication and payload. - RequestOptionChunkStream = RequestOption(0x01) + RequestOptionChunkStream bitmask.Byte = 0x01 // RequestOptionConnectionReuse indicates client side expects to reuse the connection. - RequestOptionConnectionReuse = RequestOption(0x02) + RequestOptionConnectionReuse bitmask.Byte = 0x02 - RequestOptionChunkMasking = RequestOption(0x04) + RequestOptionChunkMasking bitmask.Byte = 0x04 ) -func (o RequestOption) Has(option RequestOption) bool { - return (o & option) == option -} - -func (o *RequestOption) Set(option RequestOption) { - *o = (*o | option) -} - -func (o *RequestOption) Clear(option RequestOption) { - *o = (*o & (^option)) -} - type Security byte func (s Security) Is(t SecurityType) bool { @@ -65,7 +51,7 @@ func NormSecurity(s Security) Security { type RequestHeader struct { Version byte Command RequestCommand - Option RequestOption + Option bitmask.Byte Security Security Port net.Port Address net.Address @@ -79,28 +65,14 @@ func (h *RequestHeader) Destination() net.Destination { return net.TCPDestination(h.Address, h.Port) } -type ResponseOption byte - const ( - ResponseOptionConnectionReuse = ResponseOption(0x01) + ResponseOptionConnectionReuse bitmask.Byte = 0x01 ) -func (o *ResponseOption) Set(option ResponseOption) { - *o = (*o | option) -} - -func (o ResponseOption) Has(option ResponseOption) bool { - return (o & option) == option -} - -func (o *ResponseOption) Clear(option ResponseOption) { - *o = (*o & (^option)) -} - type ResponseCommand interface{} type ResponseHeader struct { - Option ResponseOption + Option bitmask.Byte Command ResponseCommand } diff --git a/common/protocol/headers_test.go b/common/protocol/headers_test.go deleted file mode 100644 index 5ecbdd8a..00000000 --- a/common/protocol/headers_test.go +++ /dev/null @@ -1,34 +0,0 @@ -package protocol_test - -import ( - "testing" - - . "v2ray.com/core/common/protocol" - "v2ray.com/core/testing/assert" -) - -func TestRequestOptionSet(t *testing.T) { - assert := assert.On(t) - - var option RequestOption - assert.Bool(option.Has(RequestOptionChunkStream)).IsFalse() - - option.Set(RequestOptionChunkStream) - assert.Bool(option.Has(RequestOptionChunkStream)).IsTrue() - - option.Set(RequestOptionChunkMasking) - assert.Bool(option.Has(RequestOptionChunkMasking)).IsTrue() - assert.Bool(option.Has(RequestOptionChunkStream)).IsTrue() -} - -func TestRequestOptionClear(t *testing.T) { - assert := assert.On(t) - - var option RequestOption - option.Set(RequestOptionChunkStream) - option.Set(RequestOptionChunkMasking) - - option.Clear(RequestOptionChunkStream) - assert.Bool(option.Has(RequestOptionChunkStream)).IsFalse() - assert.Bool(option.Has(RequestOptionChunkMasking)).IsTrue() -} diff --git a/proxy/shadowsocks/protocol.go b/proxy/shadowsocks/protocol.go index a9cd686c..25a360fa 100644 --- a/proxy/shadowsocks/protocol.go +++ b/proxy/shadowsocks/protocol.go @@ -5,6 +5,7 @@ import ( "crypto/rand" "io" + "v2ray.com/core/common/bitmask" "v2ray.com/core/common/buf" "v2ray.com/core/common/crypto" "v2ray.com/core/common/net" @@ -13,8 +14,8 @@ import ( ) const ( - Version = 1 - RequestOptionOneTimeAuth = protocol.RequestOption(101) + Version = 1 + RequestOptionOneTimeAuth bitmask.Byte = 0x01 AddrTypeIPv4 = 1 AddrTypeIPv6 = 4 diff --git a/proxy/vmess/encoding/client.go b/proxy/vmess/encoding/client.go index 0ff3c2bb..d3eab9eb 100644 --- a/proxy/vmess/encoding/client.go +++ b/proxy/vmess/encoding/client.go @@ -12,6 +12,7 @@ import ( "v2ray.com/core/app/log" "v2ray.com/core/common" + "v2ray.com/core/common/bitmask" "v2ray.com/core/common/buf" "v2ray.com/core/common/crypto" "v2ray.com/core/common/dice" @@ -203,7 +204,7 @@ func (c *ClientSession) DecodeResponseHeader(reader io.Reader) (*protocol.Respon } header := &protocol.ResponseHeader{ - Option: protocol.ResponseOption(buffer[1]), + Option: bitmask.Byte(buffer[1]), } if buffer[2] != 0 { diff --git a/proxy/vmess/encoding/server.go b/proxy/vmess/encoding/server.go index 257462c5..eefa9aaa 100644 --- a/proxy/vmess/encoding/server.go +++ b/proxy/vmess/encoding/server.go @@ -12,6 +12,7 @@ import ( "golang.org/x/crypto/chacha20poly1305" "v2ray.com/core/common" + "v2ray.com/core/common/bitmask" "v2ray.com/core/common/buf" "v2ray.com/core/common/crypto" "v2ray.com/core/common/net" @@ -164,8 +165,8 @@ func (s *ServerSession) DecodeRequestHeader(reader io.Reader) (*protocol.Request } s.sessionHistory.add(sid) - s.responseHeader = buffer[33] // 1 byte - request.Option = protocol.RequestOption(buffer[34]) // 1 byte + s.responseHeader = buffer[33] // 1 byte + request.Option = bitmask.Byte(buffer[34]) // 1 byte padingLen := int(buffer[35] >> 4) request.Security = protocol.NormSecurity(protocol.Security(buffer[35] & 0x0F)) // 1 bytes reserved From 24089bfad0caeba876f6bacf0f6b947c19d2e7ba Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sat, 21 Oct 2017 21:59:46 +0200 Subject: [PATCH 023/229] remove duplicated address type def --- app/proxyman/mux/frame.go | 23 ++++++++--------------- common/protocol/payload.go | 8 ++++++++ proxy/vmess/encoding/client.go | 6 +++--- proxy/vmess/encoding/const.go | 4 ---- proxy/vmess/encoding/server.go | 8 ++++---- 5 files changed, 23 insertions(+), 26 deletions(-) diff --git a/app/proxyman/mux/frame.go b/app/proxyman/mux/frame.go index b31ffed4..f742c885 100644 --- a/app/proxyman/mux/frame.go +++ b/app/proxyman/mux/frame.go @@ -4,6 +4,7 @@ import ( "v2ray.com/core/common/bitmask" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" + "v2ray.com/core/common/protocol" "v2ray.com/core/common/serial" ) @@ -27,14 +28,6 @@ const ( TargetNetworkUDP TargetNetwork = 0x02 ) -type AddressType byte - -const ( - AddressTypeIPv4 AddressType = 0x01 - AddressTypeDomain AddressType = 0x02 - AddressTypeIPv6 AddressType = 0x03 -) - /* Frame format 2 bytes - length @@ -79,16 +72,16 @@ func (f FrameMetadata) AsSupplier() buf.Supplier { addr := f.Target.Address switch addr.Family() { case net.AddressFamilyIPv4: - b = append(b, byte(AddressTypeIPv4)) + b = append(b, byte(protocol.AddressTypeIPv4)) b = append(b, addr.IP()...) length += 5 case net.AddressFamilyIPv6: - b = append(b, byte(AddressTypeIPv6)) + b = append(b, byte(protocol.AddressTypeIPv6)) b = append(b, addr.IP()...) length += 17 case net.AddressFamilyDomain: nDomain := len(addr.Domain()) - b = append(b, byte(AddressTypeDomain), byte(nDomain)) + b = append(b, byte(protocol.AddressTypeDomain), byte(nDomain)) b = append(b, addr.Domain()...) length += nDomain + 2 } @@ -115,18 +108,18 @@ func ReadFrameFrom(b []byte) (*FrameMetadata, error) { if f.SessionStatus == SessionStatusNew { network := TargetNetwork(b[0]) port := net.PortFromBytes(b[1:3]) - addrType := AddressType(b[3]) + addrType := protocol.AddressType(b[3]) b = b[4:] var addr net.Address switch addrType { - case AddressTypeIPv4: + case protocol.AddressTypeIPv4: addr = net.IPAddress(b[0:4]) b = b[4:] - case AddressTypeIPv6: + case protocol.AddressTypeIPv6: addr = net.IPAddress(b[0:16]) b = b[16:] - case AddressTypeDomain: + case protocol.AddressTypeDomain: nDomain := int(b[0]) addr = net.DomainAddress(string(b[1 : 1+nDomain])) b = b[nDomain+1:] diff --git a/common/protocol/payload.go b/common/protocol/payload.go index 82214301..03eced67 100644 --- a/common/protocol/payload.go +++ b/common/protocol/payload.go @@ -6,3 +6,11 @@ const ( TransferTypeStream TransferType = 0 TransferTypePacket TransferType = 1 ) + +type AddressType byte + +const ( + AddressTypeIPv4 AddressType = 1 + AddressTypeDomain AddressType = 2 + AddressTypeIPv6 AddressType = 3 +) diff --git a/proxy/vmess/encoding/client.go b/proxy/vmess/encoding/client.go index d3eab9eb..fff48651 100644 --- a/proxy/vmess/encoding/client.go +++ b/proxy/vmess/encoding/client.go @@ -89,13 +89,13 @@ func (c *ClientSession) EncodeRequestHeader(header *protocol.RequestHeader, writ switch header.Address.Family() { case net.AddressFamilyIPv4: - buffer = append(buffer, AddrTypeIPv4) + buffer = append(buffer, byte(protocol.AddressTypeIPv4)) buffer = append(buffer, header.Address.IP()...) case net.AddressFamilyIPv6: - buffer = append(buffer, AddrTypeIPv6) + buffer = append(buffer, byte(protocol.AddressTypeIPv6)) buffer = append(buffer, header.Address.IP()...) case net.AddressFamilyDomain: - buffer = append(buffer, AddrTypeDomain, byte(len(header.Address.Domain()))) + buffer = append(buffer, byte(protocol.AddressTypeDomain), byte(len(header.Address.Domain()))) buffer = append(buffer, header.Address.Domain()...) } } diff --git a/proxy/vmess/encoding/const.go b/proxy/vmess/encoding/const.go index 3f2a1503..d9d85878 100644 --- a/proxy/vmess/encoding/const.go +++ b/proxy/vmess/encoding/const.go @@ -2,8 +2,4 @@ package encoding const ( Version = byte(1) - - AddrTypeIPv4 = byte(0x01) - AddrTypeIPv6 = byte(0x03) - AddrTypeDomain = byte(0x02) ) diff --git a/proxy/vmess/encoding/server.go b/proxy/vmess/encoding/server.go index eefa9aaa..fc0a95b6 100644 --- a/proxy/vmess/encoding/server.go +++ b/proxy/vmess/encoding/server.go @@ -175,22 +175,22 @@ func (s *ServerSession) DecodeRequestHeader(reader io.Reader) (*protocol.Request if request.Command != protocol.RequestCommandMux { request.Port = net.PortFromBytes(buffer[38:40]) - switch buffer[40] { - case AddrTypeIPv4: + switch protocol.AddressType(buffer[40]) { + case protocol.AddressTypeIPv4: _, err = io.ReadFull(decryptor, buffer[41:45]) // 4 bytes bufferLen += 4 if err != nil { return nil, newError("failed to read IPv4 address").Base(err) } request.Address = net.IPAddress(buffer[41:45]) - case AddrTypeIPv6: + case protocol.AddressTypeIPv6: _, err = io.ReadFull(decryptor, buffer[41:57]) // 16 bytes bufferLen += 16 if err != nil { return nil, newError("failed to read IPv6 address").Base(err) } request.Address = net.IPAddress(buffer[41:57]) - case AddrTypeDomain: + case protocol.AddressTypeDomain: _, err = io.ReadFull(decryptor, buffer[41:42]) if err != nil { return nil, newError("failed to read domain address").Base(err) From 49914adf00e90ad8ff20a57f6b9dd88566f2b784 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 22 Oct 2017 15:01:36 +0200 Subject: [PATCH 024/229] remove buffer pool in favor of Go 1.9 concurrent GC --- common/buf/buffer_pool.go | 73 +-------------------------------------- 1 file changed, 1 insertion(+), 72 deletions(-) diff --git a/common/buf/buffer_pool.go b/common/buf/buffer_pool.go index be94ad46..d6604730 100644 --- a/common/buf/buffer_pool.go +++ b/common/buf/buffer_pool.go @@ -1,10 +1,7 @@ package buf import ( - "runtime" "sync" - - "v2ray.com/core/common/platform" ) // Pool provides functionality to generate and recycle buffers on demand. @@ -45,79 +42,11 @@ func (p *SyncPool) Free(buffer *Buffer) { } } -// BufferPool is a Pool that utilizes an internal cache. -type BufferPool struct { - chain chan []byte - sub Pool -} - -// NewBufferPool creates a new BufferPool with given buffer size, and internal cache size. -func NewBufferPool(bufferSize, poolSize uint32) *BufferPool { - pool := &BufferPool{ - chain: make(chan []byte, poolSize), - sub: NewSyncPool(bufferSize), - } - for i := uint32(0); i < poolSize; i++ { - pool.chain <- make([]byte, bufferSize) - } - return pool -} - -// Allocate implements Pool.Allocate(). -func (p *BufferPool) Allocate() *Buffer { - select { - case b := <-p.chain: - return &Buffer{ - v: b, - pool: p, - } - default: - return p.sub.Allocate() - } -} - -// Free implements Pool.Free(). -func (p *BufferPool) Free(buffer *Buffer) { - if buffer.v == nil { - return - } - select { - case p.chain <- buffer.v: - default: - p.sub.Free(buffer) - } -} - const ( // Size of a regular buffer. Size = 2 * 1024 - - poolSizeEnvKey = "v2ray.buffer.size" ) var ( - mediumPool Pool + mediumPool Pool = NewSyncPool(Size) ) - -func getDefaultPoolSize() int { - switch runtime.GOARCH { - case "amd64", "386": - return 20 - default: - return 5 - } -} - -func init() { - f := platform.EnvFlag{ - Name: poolSizeEnvKey, - AltName: platform.NormalizeEnvName(poolSizeEnvKey), - } - size := f.GetValueAsInt(getDefaultPoolSize()) - if size > 0 { - totalByteSize := uint32(size) * 1024 * 1024 - mediumPool = NewBufferPool(Size, totalByteSize/Size) - } else { - mediumPool = NewSyncPool(Size) - } -} From 233bb08e56181701ba392334d99153907bcc23df Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 22 Oct 2017 15:03:20 +0200 Subject: [PATCH 025/229] fix lint warnings --- common/buf/buffered_writer.go | 1 + common/buf/buffered_writer_test.go | 3 ++- common/buf/io.go | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/common/buf/buffered_writer.go b/common/buf/buffered_writer.go index 2ab504db..b3ff77a3 100644 --- a/common/buf/buffered_writer.go +++ b/common/buf/buffered_writer.go @@ -15,6 +15,7 @@ func NewBufferedWriter(writer io.Writer) *BufferedWriter { return NewBufferedWriterSize(writer, 1024) } +// NewBufferedWriterSize creates a BufferedWriter with specified buffer size. func NewBufferedWriterSize(writer io.Writer, size uint32) *BufferedWriter { return &BufferedWriter{ writer: writer, diff --git a/common/buf/buffered_writer_test.go b/common/buf/buffered_writer_test.go index c2254dd5..97cb923b 100644 --- a/common/buf/buffered_writer_test.go +++ b/common/buf/buffered_writer_test.go @@ -4,6 +4,7 @@ import ( "crypto/rand" "testing" + "v2ray.com/core/common" . "v2ray.com/core/common/buf" "v2ray.com/core/testing/assert" ) @@ -37,7 +38,7 @@ func TestBufferedWriterLargePayload(t *testing.T) { assert.Bool(writer.IsBuffered()).IsTrue() payload := make([]byte, 64*1024) - rand.Read(payload) + common.Must2(rand.Read(payload)) nBytes, err := writer.Write(payload[:512]) assert.Int(nBytes).Equals(512) diff --git a/common/buf/io.go b/common/buf/io.go index 0fe9e4f9..c66a1f78 100644 --- a/common/buf/io.go +++ b/common/buf/io.go @@ -11,6 +11,7 @@ type Reader interface { Read() (MultiBuffer, error) } +// ErrReadTimeout is an error that happens with IO timeout. var ErrReadTimeout = newError("IO timeout") type TimeoutReader interface { From 9f7fbd9a048500d695e63d5717c05e38cf7df773 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 22 Oct 2017 16:04:39 +0200 Subject: [PATCH 026/229] fix websocket test --- transport/internet/websocket/ws_test.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/transport/internet/websocket/ws_test.go b/transport/internet/websocket/ws_test.go index 49746ed2..c90161c1 100644 --- a/transport/internet/websocket/ws_test.go +++ b/transport/internet/websocket/ws_test.go @@ -6,7 +6,6 @@ import ( "testing" "time" - "v2ray.com/core/common" "v2ray.com/core/common/net" "v2ray.com/core/testing/assert" tlsgen "v2ray.com/core/testing/tls" @@ -89,7 +88,7 @@ func Test_listenWSAndDial_TLS(t *testing.T) { }) listen, err := ListenWS(ctx, net.DomainAddress("localhost"), 13143, func(ctx context.Context, conn internet.Connection) bool { go func() { - common.Must(conn.Close()) + _ = conn.Close() }() return true }) @@ -98,5 +97,5 @@ func Test_listenWSAndDial_TLS(t *testing.T) { conn, err := Dial(ctx, net.TCPDestination(net.DomainAddress("localhost"), 13143)) assert.Error(err).IsNil() - common.Must(conn.Close()) + _ = conn.Close() } From 9f392eb5062b35ec524ea6e44a1f1c239936a227 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 22 Oct 2017 19:48:19 +0200 Subject: [PATCH 027/229] avoid long domain names in mux --- app/proxyman/mux/frame.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/proxyman/mux/frame.go b/app/proxyman/mux/frame.go index f742c885..0824cff8 100644 --- a/app/proxyman/mux/frame.go +++ b/app/proxyman/mux/frame.go @@ -80,9 +80,14 @@ func (f FrameMetadata) AsSupplier() buf.Supplier { b = append(b, addr.IP()...) length += 17 case net.AddressFamilyDomain: - nDomain := len(addr.Domain()) + domain := addr.Domain() + nDomain := len(domain) + if nDomain > 256 { + nDomain = 256 + domain = domain[:256] + } b = append(b, byte(protocol.AddressTypeDomain), byte(nDomain)) - b = append(b, addr.Domain()...) + b = append(b, domain...) length += nDomain + 2 } } From 26818a2602b85a7960c97a467e78be1147a11ea4 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 22 Oct 2017 20:17:06 +0200 Subject: [PATCH 028/229] fix domain length issue for all proxies --- app/proxyman/mux/frame.go | 7 +++---- common/protocol/headers.go | 4 ++++ proxy/shadowsocks/protocol.go | 13 +++++++++---- proxy/socks/protocol.go | 10 +++++----- proxy/vmess/encoding/client.go | 14 ++++++++++---- proxy/vmess/encoding/encoding_test.go | 3 ++- proxy/vmess/outbound/outbound.go | 4 +++- 7 files changed, 36 insertions(+), 19 deletions(-) diff --git a/app/proxyman/mux/frame.go b/app/proxyman/mux/frame.go index 0824cff8..462dd0da 100644 --- a/app/proxyman/mux/frame.go +++ b/app/proxyman/mux/frame.go @@ -81,11 +81,10 @@ func (f FrameMetadata) AsSupplier() buf.Supplier { length += 17 case net.AddressFamilyDomain: domain := addr.Domain() - nDomain := len(domain) - if nDomain > 256 { - nDomain = 256 - domain = domain[:256] + if protocol.IsDomainTooLong(domain) { + return 0, newError("domain name too long: ", domain) } + nDomain := len(domain) b = append(b, byte(protocol.AddressTypeDomain), byte(nDomain)) b = append(b, domain...) length += nDomain + 2 diff --git a/common/protocol/headers.go b/common/protocol/headers.go index fb64ce71..ecf798f0 100644 --- a/common/protocol/headers.go +++ b/common/protocol/headers.go @@ -97,3 +97,7 @@ func (sc *SecurityConfig) AsSecurity() Security { } return NormSecurity(Security(sc.Type)) } + +func IsDomainTooLong(domain string) bool { + return len(domain) > 256 +} diff --git a/proxy/shadowsocks/protocol.go b/proxy/shadowsocks/protocol.go index 25a360fa..529b2cb2 100644 --- a/proxy/shadowsocks/protocol.go +++ b/proxy/shadowsocks/protocol.go @@ -5,6 +5,7 @@ import ( "crypto/rand" "io" + "v2ray.com/core/common" "v2ray.com/core/common/bitmask" "v2ray.com/core/common/buf" "v2ray.com/core/common/crypto" @@ -160,19 +161,23 @@ func WriteTCPRequest(request *protocol.RequestHeader, writer io.Writer) (buf.Wri header.AppendBytes(AddrTypeIPv6) header.Append([]byte(request.Address.IP())) case net.AddressFamilyDomain: - header.AppendBytes(AddrTypeDomain, byte(len(request.Address.Domain()))) - header.Append([]byte(request.Address.Domain())) + domain := request.Address.Domain() + if protocol.IsDomainTooLong(domain) { + return nil, newError("domain name too long: ", domain) + } + header.AppendBytes(AddrTypeDomain, byte(len(domain))) + common.Must(header.AppendSupplier(serial.WriteString(domain))) default: return nil, newError("unsupported address type: ", request.Address.Family()) } - header.AppendSupplier(serial.WriteUint16(uint16(request.Port))) + common.Must(header.AppendSupplier(serial.WriteUint16(uint16(request.Port)))) if request.Option.Has(RequestOptionOneTimeAuth) { header.SetByte(0, header.Byte(0)|0x10) authenticator := NewAuthenticator(HeaderKeyGenerator(account.Key, iv)) - header.AppendSupplier(authenticator.Authenticate(header.Bytes())) + common.Must(header.AppendSupplier(authenticator.Authenticate(header.Bytes()))) } _, err = writer.Write(header.Bytes()) diff --git a/proxy/socks/protocol.go b/proxy/socks/protocol.go index d1432bb8..f956b6f0 100644 --- a/proxy/socks/protocol.go +++ b/proxy/socks/protocol.go @@ -3,6 +3,7 @@ package socks import ( "io" + "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" @@ -253,14 +254,13 @@ func appendAddress(buffer *buf.Buffer, address net.Address, port net.Port) error buffer.AppendBytes(0x04) buffer.Append(address.IP()) case net.AddressFamilyDomain: - n := byte(len(address.Domain())) - if int(n) != len(address.Domain()) { - return newError("Super long domain is not supported in Socks protocol. ", address.Domain()) + if protocol.IsDomainTooLong(address.Domain()) { + return newError("Super long domain is not supported in Socks protocol: ", address.Domain()) } buffer.AppendBytes(0x03, byte(len(address.Domain()))) - buffer.AppendSupplier(serial.WriteString(address.Domain())) + common.Must(buffer.AppendSupplier(serial.WriteString(address.Domain()))) } - buffer.AppendSupplier(serial.WriteUint16(port.Value())) + common.Must(buffer.AppendSupplier(serial.WriteUint16(port.Value()))) return nil } diff --git a/proxy/vmess/encoding/client.go b/proxy/vmess/encoding/client.go index fff48651..e35a3126 100644 --- a/proxy/vmess/encoding/client.go +++ b/proxy/vmess/encoding/client.go @@ -60,12 +60,12 @@ func NewClientSession(idHash protocol.IDHash) *ClientSession { return session } -func (c *ClientSession) EncodeRequestHeader(header *protocol.RequestHeader, writer io.Writer) { +func (c *ClientSession) EncodeRequestHeader(header *protocol.RequestHeader, writer io.Writer) error { timestamp := protocol.NewTimestampGenerator(protocol.NowTime(), 30)() account, err := header.User.GetTypedAccount() if err != nil { log.Trace(newError("failed to get user account: ", err).AtError()) - return + return nil } idHash := c.idHash(account.(*vmess.InternalAccount).AnyValidID().Bytes()) common.Must2(idHash.Write(timestamp.Bytes(nil))) @@ -95,8 +95,13 @@ func (c *ClientSession) EncodeRequestHeader(header *protocol.RequestHeader, writ buffer = append(buffer, byte(protocol.AddressTypeIPv6)) buffer = append(buffer, header.Address.IP()...) case net.AddressFamilyDomain: - buffer = append(buffer, byte(protocol.AddressTypeDomain), byte(len(header.Address.Domain()))) - buffer = append(buffer, header.Address.Domain()...) + domain := header.Address.Domain() + if protocol.IsDomainTooLong(domain) { + return newError("long domain not supported: ", domain) + } + nDomain := len(domain) + buffer = append(buffer, byte(protocol.AddressTypeDomain), byte(nDomain)) + buffer = append(buffer, domain...) } } @@ -117,6 +122,7 @@ func (c *ClientSession) EncodeRequestHeader(header *protocol.RequestHeader, writ aesStream := crypto.NewAesEncryptionStream(account.(*vmess.InternalAccount).ID.CmdKey(), iv) aesStream.XORKeyStream(buffer, buffer) common.Must2(writer.Write(buffer)) + return nil } func (c *ClientSession) EncodeRequestBody(request *protocol.RequestHeader, writer io.Writer) buf.Writer { diff --git a/proxy/vmess/encoding/encoding_test.go b/proxy/vmess/encoding/encoding_test.go index a31db21d..043e3384 100644 --- a/proxy/vmess/encoding/encoding_test.go +++ b/proxy/vmess/encoding/encoding_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" @@ -38,7 +39,7 @@ func TestRequestSerialization(t *testing.T) { buffer := buf.New() client := NewClientSession(protocol.DefaultIDHash) - client.EncodeRequestHeader(expectedRequest, buffer) + common.Must(client.EncodeRequestHeader(expectedRequest, buffer)) buffer2 := buf.New() buffer2.Append(buffer.Bytes()) diff --git a/proxy/vmess/outbound/outbound.go b/proxy/vmess/outbound/outbound.go index 27c41776..62e33149 100644 --- a/proxy/vmess/outbound/outbound.go +++ b/proxy/vmess/outbound/outbound.go @@ -108,7 +108,9 @@ func (v *Handler) Process(ctx context.Context, outboundRay ray.OutboundRay, dial requestDone := signal.ExecuteAsync(func() error { writer := buf.NewBufferedWriter(conn) - session.EncodeRequestHeader(request, writer) + if err := session.EncodeRequestHeader(request, writer); err != nil { + return newError("failed to encode request").Base(err).AtWarning() + } bodyWriter := session.EncodeRequestBody(request, writer) firstPayload, err := input.ReadTimeout(time.Millisecond * 500) From a1f4f2a39adebeaa75110b2ed6b62fa0d4c74fd4 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 22 Oct 2017 20:39:28 +0200 Subject: [PATCH 029/229] Update version --- core.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core.go b/core.go index 50d1e0da..d06bfae5 100644 --- a/core.go +++ b/core.go @@ -18,7 +18,7 @@ import ( ) var ( - version = "2.42" + version = "2.43" build = "Custom" codename = "One for all" intro = "An unified platform for anti-censorship." From 66b81a842d0122baf16dd52fb416157efcb16013 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 22 Oct 2017 22:45:05 +0200 Subject: [PATCH 030/229] comments --- common/net/system.go | 1 + common/protocol/headers.go | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/common/net/system.go b/common/net/system.go index da2289a5..6edc4ca4 100644 --- a/common/net/system.go +++ b/common/net/system.go @@ -31,6 +31,7 @@ type UDPConn = net.UDPConn type UnixAddr = net.UnixAddr type UnixConn = net.UnixConn +// IP is an alias for net.IP. type IP = net.IP type IPMask = net.IPMask type IPNet = net.IPNet diff --git a/common/protocol/headers.go b/common/protocol/headers.go index ecf798f0..00945f8e 100644 --- a/common/protocol/headers.go +++ b/common/protocol/headers.go @@ -80,8 +80,8 @@ type CommandSwitchAccount struct { Host net.Address Port net.Port ID *uuid.UUID - AlterIds uint16 Level uint32 + AlterIds uint16 ValidMin byte } From 62258e6aefecce36b96d87f18bb413592d952e6d Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Mon, 23 Oct 2017 14:09:14 +0200 Subject: [PATCH 031/229] fix #638 --- transport/ray/direct.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/transport/ray/direct.go b/transport/ray/direct.go index f9406f8e..e26348c2 100644 --- a/transport/ray/direct.go +++ b/transport/ray/direct.go @@ -143,15 +143,20 @@ func (s *Stream) ReadTimeout(timeout time.Duration) (buf.MultiBuffer, error) { } } +// Size returns the number of bytes hold in the Stream. +func (s *Stream) Size() uint64 { + s.access.RLock() + defer s.access.RUnlock() + + return s.size +} + func (s *Stream) waitForStreamSize() error { if streamSizeLimit == 0 { return nil } - s.access.RLock() - defer s.access.RUnlock() - - for streamSizeLimit > 0 && s.size >= streamSizeLimit { + for s.Size() >= streamSizeLimit { select { case <-s.ctx.Done(): return io.ErrClosedPipe From 2b86aaad3ec32968359c725f2588dfcb4a72d372 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Mon, 23 Oct 2017 14:10:17 +0200 Subject: [PATCH 032/229] Update version --- core.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core.go b/core.go index d06bfae5..8191e0a0 100644 --- a/core.go +++ b/core.go @@ -18,7 +18,7 @@ import ( ) var ( - version = "2.43" + version = "2.44" build = "Custom" codename = "One for all" intro = "An unified platform for anti-censorship." From 94bba496747209d3a27bba110e8301400eb2258e Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Mon, 23 Oct 2017 14:15:16 +0200 Subject: [PATCH 033/229] fix lint warnings --- transport/ray/direct.go | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/transport/ray/direct.go b/transport/ray/direct.go index e26348c2..34a01fc8 100644 --- a/transport/ray/direct.go +++ b/transport/ray/direct.go @@ -6,6 +6,7 @@ import ( "sync" "time" + "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/platform" ) @@ -50,6 +51,7 @@ func init() { streamSizeLimit = uint64(size) * 1024 * 1024 } +// Stream is a sequential container for data in bytes. type Stream struct { access sync.RWMutex data buf.MultiBuffer @@ -61,6 +63,7 @@ type Stream struct { err bool } +// NewStream creates a new Stream. func NewStream(ctx context.Context) *Stream { return &Stream{ ctx: ctx, @@ -92,15 +95,17 @@ func (s *Stream) getData() (buf.MultiBuffer, error) { return nil, nil } +// Peek fills in the given buffer with data from head of the Stream. func (s *Stream) Peek(b *buf.Buffer) { s.access.RLock() defer s.access.RUnlock() - b.Reset(func(data []byte) (int, error) { + common.Must(b.Reset(func(data []byte) (int, error) { return s.data.Copy(data), nil - }) + })) } +// Read reads data from the Stream. func (s *Stream) Read() (buf.MultiBuffer, error) { for { mb, err := s.getData() @@ -121,6 +126,7 @@ func (s *Stream) Read() (buf.MultiBuffer, error) { } } +// ReadTimeout reads from the Stream with a specified timeout. func (s *Stream) ReadTimeout(timeout time.Duration) (buf.MultiBuffer, error) { for { mb, err := s.getData() @@ -151,6 +157,7 @@ func (s *Stream) Size() uint64 { return s.size } +// waitForStreamSize waits until the Stream has room for more data, or any error happens. func (s *Stream) waitForStreamSize() error { if streamSizeLimit == 0 { return nil @@ -170,6 +177,7 @@ func (s *Stream) waitForStreamSize() error { return nil } +// Write writes more data into the Stream. func (s *Stream) Write(data buf.MultiBuffer) error { if data.IsEmpty() { return nil @@ -213,6 +221,7 @@ func (s *Stream) notifyWrite() { } } +// Close closes the stream for writing. Read() still works until EOF. func (s *Stream) Close() { s.access.Lock() s.close = true @@ -221,6 +230,7 @@ func (s *Stream) Close() { s.access.Unlock() } +// CloseError closes the Stream with error. Read() will return an error afterwards. func (s *Stream) CloseError() { s.access.Lock() s.err = true From e06e3db50a6c92539ab276e13c2a21b2edc8eb46 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Mon, 23 Oct 2017 17:39:15 +0200 Subject: [PATCH 034/229] fix lint warnings --- proxy/blackhole/blackhole.go | 4 ++-- proxy/blackhole/config.go | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/proxy/blackhole/blackhole.go b/proxy/blackhole/blackhole.go index ce3fe63a..b324a97a 100644 --- a/proxy/blackhole/blackhole.go +++ b/proxy/blackhole/blackhole.go @@ -29,8 +29,8 @@ func New(ctx context.Context, config *Config) (*Handler, error) { } // Process implements OutboundHandler.Dispatch(). -func (v *Handler) Process(ctx context.Context, outboundRay ray.OutboundRay, dialer proxy.Dialer) error { - v.response.WriteTo(outboundRay.OutboundOutput()) +func (h *Handler) Process(ctx context.Context, outboundRay ray.OutboundRay, dialer proxy.Dialer) error { + h.response.WriteTo(outboundRay.OutboundOutput()) // Sleep a little here to make sure the response is sent to client. time.Sleep(time.Second) outboundRay.OutboundOutput().CloseError() diff --git a/proxy/blackhole/config.go b/proxy/blackhole/config.go index 2c27a344..88c58c9a 100644 --- a/proxy/blackhole/config.go +++ b/proxy/blackhole/config.go @@ -1,6 +1,7 @@ package blackhole import ( + "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/serial" ) @@ -27,7 +28,7 @@ func (*NoneResponse) WriteTo(buf.Writer) {} // WriteTo implements ResponseConfig.WriteTo(). func (*HTTPResponse) WriteTo(writer buf.Writer) { b := buf.NewLocal(512) - b.AppendSupplier(serial.WriteString(http403response)) + common.Must(b.AppendSupplier(serial.WriteString(http403response))) writer.Write(buf.NewMultiBufferValue(b)) } From 34ea53e5b7efa747f852010135de1562d23b1fef Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Mon, 23 Oct 2017 18:42:38 +0200 Subject: [PATCH 035/229] comments --- proxy/context.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/proxy/context.go b/proxy/context.go index f0400a65..2f59dd77 100644 --- a/proxy/context.go +++ b/proxy/context.go @@ -17,10 +17,12 @@ const ( resolvedIPsKey ) +// ContextWithSource creates a new context with given source. func ContextWithSource(ctx context.Context, src net.Destination) context.Context { return context.WithValue(ctx, sourceKey, src) } +// SourceFromContext retreives source from the given context. func SourceFromContext(ctx context.Context) (net.Destination, bool) { v, ok := ctx.Value(sourceKey).(net.Destination) return v, ok From 6ddafdbd7317a13aee79e0c970c548603f041636 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Mon, 23 Oct 2017 23:47:20 +0200 Subject: [PATCH 036/229] net assert --- common/net/address_test.go | 14 ++++++----- common/net/testing/assert.go | 46 ++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 6 deletions(-) create mode 100644 common/net/testing/assert.go diff --git a/common/net/address_test.go b/common/net/address_test.go index 42472731..58583d24 100644 --- a/common/net/address_test.go +++ b/common/net/address_test.go @@ -5,20 +5,22 @@ import ( "testing" . "v2ray.com/core/common/net" + . "v2ray.com/core/common/net/testing" "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" ) func TestIPv4Address(t *testing.T) { - assert := assert.On(t) + assert := With(t) ip := []byte{byte(1), byte(2), byte(3), byte(4)} addr := IPAddress(ip) - assert.Address(addr).IsIPv4() - assert.Address(addr).IsNotIPv6() - assert.Address(addr).IsNotDomain() - assert.Bytes(addr.IP()).Equals(ip) - assert.Address(addr).EqualsString("1.2.3.4") + assert(addr, IsIPv4) + assert(addr, Not(IsIPv6)) + assert(addr, Not(IsDomain)) + assert([]byte(addr.IP()), Equals, ip) + assert(addr.String(), Equals, "1.2.3.4") } func TestIPv6Address(t *testing.T) { diff --git a/common/net/testing/assert.go b/common/net/testing/assert.go new file mode 100644 index 00000000..9256d049 --- /dev/null +++ b/common/net/testing/assert.go @@ -0,0 +1,46 @@ +package testing + +import ( + "reflect" + + "v2ray.com/core/common/net" + "v2ray.com/ext/assert" +) + +var IsIPv4 = assert.CreateOperator(reflect.TypeOf(net.Address(nil)), reflect.ValueOf(func(a net.Address) bool { + return a.Family().IsIPv4() +}), 1, "is IPv4") + +var IsIPv6 = assert.CreateOperator(reflect.TypeOf(net.Address(nil)), reflect.ValueOf(func(a net.Address) bool { + return a.Family().IsIPv6() +}), 1, "is IPv6") + +var IsIP = assert.CreateOperator(reflect.TypeOf(net.Address(nil)), reflect.ValueOf(func(a net.Address) bool { + return a.Family().IsIPv4() || a.Family().IsIPv6() +}), 1, "is IP") + +var IsTCP = assert.CreateOperator(reflect.TypeOf(net.Destination{}), reflect.ValueOf(func(a net.Destination) bool { + return a.Network == net.Network_TCP +}), 1, "is TCP") + +var IsUDP = assert.CreateOperator(reflect.TypeOf(net.Destination{}), reflect.ValueOf(func(a net.Destination) bool { + return a.Network == net.Network_UDP +}), 1, "is UDP") + +var IsDomain = assert.CreateOperator(reflect.TypeOf(net.Address(nil)), reflect.ValueOf(func(a net.Address) bool { + return a.Family().IsDomain() +}), 1, "is Domain") + +func init() { + assert.RegisterEqualsOperator(reflect.TypeOf((*net.Address)(nil)).Elem(), reflect.ValueOf(func(a, b net.Address) bool { + return a == b + })) + + assert.RegisterEqualsOperator(reflect.TypeOf(net.Destination{}), reflect.ValueOf(func(a, b net.Destination) bool { + return a == b + })) + + assert.RegisterEqualsOperator(reflect.TypeOf(net.Port(0)), reflect.ValueOf(func(a, b net.Port) bool { + return a == b + })) +} From 4a0ca30d08700876047ba60a473aa254bc6f6e00 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Tue, 24 Oct 2017 10:03:00 +0200 Subject: [PATCH 037/229] update assertion api --- common/net/testing/assert.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/common/net/testing/assert.go b/common/net/testing/assert.go index 9256d049..16c9f5aa 100644 --- a/common/net/testing/assert.go +++ b/common/net/testing/assert.go @@ -7,40 +7,40 @@ import ( "v2ray.com/ext/assert" ) -var IsIPv4 = assert.CreateOperator(reflect.TypeOf(net.Address(nil)), reflect.ValueOf(func(a net.Address) bool { +var IsIPv4 = assert.CreateMatcher(reflect.TypeOf(net.Address(nil)), reflect.ValueOf(func(a net.Address) bool { return a.Family().IsIPv4() }), 1, "is IPv4") -var IsIPv6 = assert.CreateOperator(reflect.TypeOf(net.Address(nil)), reflect.ValueOf(func(a net.Address) bool { +var IsIPv6 = assert.CreateMatcher(reflect.TypeOf(net.Address(nil)), reflect.ValueOf(func(a net.Address) bool { return a.Family().IsIPv6() }), 1, "is IPv6") -var IsIP = assert.CreateOperator(reflect.TypeOf(net.Address(nil)), reflect.ValueOf(func(a net.Address) bool { +var IsIP = assert.CreateMatcher(reflect.TypeOf(net.Address(nil)), reflect.ValueOf(func(a net.Address) bool { return a.Family().IsIPv4() || a.Family().IsIPv6() }), 1, "is IP") -var IsTCP = assert.CreateOperator(reflect.TypeOf(net.Destination{}), reflect.ValueOf(func(a net.Destination) bool { +var IsTCP = assert.CreateMatcher(reflect.TypeOf(net.Destination{}), reflect.ValueOf(func(a net.Destination) bool { return a.Network == net.Network_TCP }), 1, "is TCP") -var IsUDP = assert.CreateOperator(reflect.TypeOf(net.Destination{}), reflect.ValueOf(func(a net.Destination) bool { +var IsUDP = assert.CreateMatcher(reflect.TypeOf(net.Destination{}), reflect.ValueOf(func(a net.Destination) bool { return a.Network == net.Network_UDP }), 1, "is UDP") -var IsDomain = assert.CreateOperator(reflect.TypeOf(net.Address(nil)), reflect.ValueOf(func(a net.Address) bool { +var IsDomain = assert.CreateMatcher(reflect.TypeOf(net.Address(nil)), reflect.ValueOf(func(a net.Address) bool { return a.Family().IsDomain() }), 1, "is Domain") func init() { - assert.RegisterEqualsOperator(reflect.TypeOf((*net.Address)(nil)).Elem(), reflect.ValueOf(func(a, b net.Address) bool { + assert.RegisterEqualsMatcher(reflect.TypeOf((*net.Address)(nil)).Elem(), reflect.ValueOf(func(a, b net.Address) bool { return a == b })) - assert.RegisterEqualsOperator(reflect.TypeOf(net.Destination{}), reflect.ValueOf(func(a, b net.Destination) bool { + assert.RegisterEqualsMatcher(reflect.TypeOf(net.Destination{}), reflect.ValueOf(func(a, b net.Destination) bool { return a == b })) - assert.RegisterEqualsOperator(reflect.TypeOf(net.Port(0)), reflect.ValueOf(func(a, b net.Port) bool { + assert.RegisterEqualsMatcher(reflect.TypeOf(net.Port(0)), reflect.ValueOf(func(a, b net.Port) bool { return a == b })) } From 74cf833758ad3c54451efad226e89a358281ec17 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Tue, 24 Oct 2017 16:15:35 +0200 Subject: [PATCH 038/229] fully migrate to new assertion lib --- app/dispatcher/impl/sniffer_test.go | 14 +- app/dns/server/querier.go | 20 +++ app/dns/server/server.go | 11 ++ app/log/internal/log_entry_test.go | 12 +- app/proxyman/mux/mux_test.go | 112 ++++++------ app/proxyman/mux/session_test.go | 20 +-- app/router/condition_test.go | 12 +- app/router/router_test.go | 18 +- common/bitmask/byte_test.go | 16 +- common/buf/buffer_test.go | 38 ++-- common/buf/buffered_reader_test.go | 20 +-- common/buf/buffered_writer_test.go | 34 ++-- common/buf/multi_buffer_test.go | 14 +- common/buf/reader_test.go | 36 ++-- common/buf/writer_test.go | 20 +-- common/crypto/auth_test.go | 46 ++--- common/crypto/chacha20_test.go | 10 +- common/crypto/chunk_test.go | 26 +-- common/errors/errors_test.go | 18 +- common/net/address_test.go | 35 ++-- common/net/destination_test.go | 19 +- common/net/ipnet_test.go | 20 +-- common/net/port_test.go | 6 +- common/net/testing/assert.go | 42 ++--- common/platform/platform_test.go | 12 +- common/protocol/id_test.go | 6 +- common/protocol/server_picker_test.go | 28 +-- common/protocol/server_spec_test.go | 16 +- common/protocol/time_test.go | 8 +- common/retry/retry_test.go | 32 ++-- common/serial/bytes_test.go | 10 +- common/serial/numbers_test.go | 6 +- common/serial/typed_message_test.go | 8 +- common/signal/exec_test.go | 18 +- common/signal/timer_test.go | 12 +- common/uuid/uuid_test.go | 44 ++--- proxy/blackhole/config_test.go | 8 +- proxy/http/server_test.go | 26 +-- proxy/shadowsocks/ota_test.go | 14 +- proxy/shadowsocks/protocol_test.go | 44 ++--- proxy/socks/protocol_test.go | 10 +- proxy/vmess/encoding/auth_test.go | 10 +- proxy/vmess/encoding/commands_test.go | 24 +-- proxy/vmess/encoding/encoding_test.go | 20 +-- testing/scenarios/dns_test.go | 22 +-- testing/scenarios/dokodemo_test.go | 38 ++-- testing/scenarios/feature_test.go | 138 +++++++------- testing/scenarios/http_test.go | 16 +- testing/scenarios/shadowsocks_test.go | 50 +++--- testing/scenarios/socks_test.go | 96 +++++----- testing/scenarios/tls_test.go | 50 +++--- testing/scenarios/transport_test.go | 18 +- testing/scenarios/vmess_test.go | 170 +++++++++--------- transport/internet/dialer_test.go | 10 +- transport/internet/header_test.go | 16 +- transport/internet/headers/http/http_test.go | 40 ++--- transport/internet/headers/srtp/srtp_test.go | 6 +- transport/internet/headers/utp/utp_test.go | 6 +- .../internet/headers/wechat/wechat_test.go | 6 +- transport/internet/kcp/connection_test.go | 8 +- transport/internet/kcp/crypt_test.go | 14 +- transport/internet/kcp/kcp_test.go | 14 +- transport/internet/kcp/receiving_test.go | 24 ++- transport/internet/kcp/segment_test.go | 68 +++---- transport/internet/kcp/sending_test.go | 26 +-- transport/internet/tcp/sockopt_linux_test.go | 10 +- transport/internet/udp/dispatcher_test.go | 10 +- transport/internet/websocket/ws_test.go | 59 +++--- transport/ray/direct_test.go | 20 +-- v2ray_test.go | 6 +- 70 files changed, 974 insertions(+), 942 deletions(-) create mode 100644 app/dns/server/querier.go diff --git a/app/dispatcher/impl/sniffer_test.go b/app/dispatcher/impl/sniffer_test.go index 6b10c17a..ce252de4 100644 --- a/app/dispatcher/impl/sniffer_test.go +++ b/app/dispatcher/impl/sniffer_test.go @@ -4,11 +4,11 @@ import ( "testing" . "v2ray.com/core/app/dispatcher/impl" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" ) func TestHTTPHeaders(t *testing.T) { - assert := assert.On(t) + assert := With(t) cases := []struct { input string @@ -94,13 +94,13 @@ first_name=John&last_name=Doe&action=Submit`, for _, test := range cases { domain, err := SniffHTTP([]byte(test.input)) - assert.String(domain).Equals(test.domain) - assert.Error(err).Equals(test.err) + assert(domain, Equals, test.domain) + assert(err, Equals, test.err) } } func TestTLSHeaders(t *testing.T) { - assert := assert.On(t) + assert := With(t) cases := []struct { input []byte @@ -180,7 +180,7 @@ func TestTLSHeaders(t *testing.T) { for _, test := range cases { domain, err := SniffTLS(test.input) - assert.String(domain).Equals(test.domain) - assert.Error(err).Equals(test.err) + assert(domain, Equals, test.domain) + assert(err, Equals, test.err) } } diff --git a/app/dns/server/querier.go b/app/dns/server/querier.go new file mode 100644 index 00000000..722c8163 --- /dev/null +++ b/app/dns/server/querier.go @@ -0,0 +1,20 @@ +package server + +import ( + "time" + + "v2ray.com/core/common/net" +) + +type IPResult struct { + IP []net.IP + TTL time.Duration +} + +type Querier interface { + QueryDomain(domain string) <-chan *IPResult +} + +type UDPQuerier struct { + server net.Destination +} diff --git a/app/dns/server/server.go b/app/dns/server/server.go index 2fedbedf..567cf457 100644 --- a/app/dns/server/server.go +++ b/app/dns/server/server.go @@ -24,6 +24,17 @@ type DomainRecord struct { A *ARecord } +type Record struct { + IP []net.IP + Expire time.Time + LastAccess time.Time +} + +func (r *Record) Expired() bool { + now := time.Now() + return r.Expire.Before(now) || r.LastAccess.Add(time.Hour).Before(now) +} + type CacheServer struct { sync.RWMutex hosts map[string]net.IP diff --git a/app/log/internal/log_entry_test.go b/app/log/internal/log_entry_test.go index c20b45eb..c67185a0 100644 --- a/app/log/internal/log_entry_test.go +++ b/app/log/internal/log_entry_test.go @@ -4,11 +4,11 @@ import ( "testing" . "v2ray.com/core/app/log/internal" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" ) func TestAccessLog(t *testing.T) { - assert := assert.On(t) + assert := With(t) entry := &AccessLog{ From: "test_from", @@ -18,8 +18,8 @@ func TestAccessLog(t *testing.T) { } entryStr := entry.String() - assert.String(entryStr).Contains("test_from") - assert.String(entryStr).Contains("test_to") - assert.String(entryStr).Contains("test_reason") - assert.String(entryStr).Contains("Accepted") + assert(entryStr, HasSubstring, "test_from") + assert(entryStr, HasSubstring, "test_to") + assert(entryStr, HasSubstring, "test_reason") + assert(entryStr, HasSubstring, "Accepted") } diff --git a/app/proxyman/mux/mux_test.go b/app/proxyman/mux/mux_test.go index 4276fbbf..775f87f8 100644 --- a/app/proxyman/mux/mux_test.go +++ b/app/proxyman/mux/mux_test.go @@ -9,8 +9,8 @@ import ( "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" - "v2ray.com/core/testing/assert" "v2ray.com/core/transport/ray" + . "v2ray.com/ext/assert" ) func readAll(reader buf.Reader) (buf.MultiBuffer, error) { @@ -29,7 +29,7 @@ func readAll(reader buf.Reader) (buf.MultiBuffer, error) { } func TestReaderWriter(t *testing.T) { - assert := assert.On(t) + assert := With(t) stream := ray.NewStream(context.Background()) @@ -48,16 +48,16 @@ func TestReaderWriter(t *testing.T) { return writer.Write(buf.NewMultiBufferValue(b)) } - assert.Error(writePayload(writer, 'a', 'b', 'c', 'd')).IsNil() - assert.Error(writePayload(writer2)).IsNil() + assert(writePayload(writer, 'a', 'b', 'c', 'd'), IsNil) + assert(writePayload(writer2), IsNil) - assert.Error(writePayload(writer, 'e', 'f', 'g', 'h')).IsNil() - assert.Error(writePayload(writer3, 'x')).IsNil() + assert(writePayload(writer, 'e', 'f', 'g', 'h'), IsNil) + assert(writePayload(writer3, 'x'), IsNil) writer.Close() writer3.Close() - assert.Error(writePayload(writer2, 'y')).IsNil() + assert(writePayload(writer2, 'y'), IsNil) writer2.Close() bytesReader := buf.ToBytesReader(stream) @@ -65,79 +65,79 @@ func TestReaderWriter(t *testing.T) { streamReader := NewStreamReader(bytesReader) meta, err := metaReader.Read() - assert.Error(err).IsNil() - assert.Uint16(meta.SessionID).Equals(1) - assert.Byte(byte(meta.SessionStatus)).Equals(byte(SessionStatusNew)) - assert.Destination(meta.Target).Equals(dest) - assert.Byte(byte(meta.Option)).Equals(byte(OptionData)) + assert(err, IsNil) + assert(meta.SessionID, Equals, uint16(1)) + assert(byte(meta.SessionStatus), Equals, byte(SessionStatusNew)) + assert(meta.Target, Equals, dest) + assert(byte(meta.Option), Equals, byte(OptionData)) data, err := readAll(streamReader) - assert.Error(err).IsNil() - assert.Int(len(data)).Equals(1) - assert.String(data[0].String()).Equals("abcd") + assert(err, IsNil) + assert(len(data), Equals, 1) + assert(data[0].String(), Equals, "abcd") meta, err = metaReader.Read() - assert.Error(err).IsNil() - assert.Byte(byte(meta.SessionStatus)).Equals(byte(SessionStatusNew)) - assert.Uint16(meta.SessionID).Equals(2) - assert.Byte(byte(meta.Option)).Equals(0) - assert.Destination(meta.Target).Equals(dest2) + assert(err, IsNil) + assert(byte(meta.SessionStatus), Equals, byte(SessionStatusNew)) + assert(meta.SessionID, Equals, uint16(2)) + assert(byte(meta.Option), Equals, byte(0)) + assert(meta.Target, Equals, dest2) meta, err = metaReader.Read() - assert.Error(err).IsNil() - assert.Byte(byte(meta.SessionStatus)).Equals(byte(SessionStatusKeep)) - assert.Uint16(meta.SessionID).Equals(1) - assert.Byte(byte(meta.Option)).Equals(1) + assert(err, IsNil) + assert(byte(meta.SessionStatus), Equals, byte(SessionStatusKeep)) + assert(meta.SessionID, Equals, uint16(1)) + assert(byte(meta.Option), Equals, byte(1)) data, err = readAll(streamReader) - assert.Error(err).IsNil() - assert.Int(len(data)).Equals(1) - assert.String(data[0].String()).Equals("efgh") + assert(err, IsNil) + assert(len(data), Equals, 1) + assert(data[0].String(), Equals, "efgh") meta, err = metaReader.Read() - assert.Error(err).IsNil() - assert.Byte(byte(meta.SessionStatus)).Equals(byte(SessionStatusNew)) - assert.Uint16(meta.SessionID).Equals(3) - assert.Byte(byte(meta.Option)).Equals(1) - assert.Destination(meta.Target).Equals(dest3) + assert(err, IsNil) + assert(byte(meta.SessionStatus), Equals, byte(SessionStatusNew)) + assert(meta.SessionID, Equals, uint16(3)) + assert(byte(meta.Option), Equals, byte(1)) + assert(meta.Target, Equals, dest3) data, err = readAll(streamReader) - assert.Error(err).IsNil() - assert.Int(len(data)).Equals(1) - assert.String(data[0].String()).Equals("x") + assert(err, IsNil) + assert(len(data), Equals, 1) + assert(data[0].String(), Equals, "x") meta, err = metaReader.Read() - assert.Error(err).IsNil() - assert.Byte(byte(meta.SessionStatus)).Equals(byte(SessionStatusEnd)) - assert.Uint16(meta.SessionID).Equals(1) - assert.Byte(byte(meta.Option)).Equals(0) + assert(err, IsNil) + assert(byte(meta.SessionStatus), Equals, byte(SessionStatusEnd)) + assert(meta.SessionID, Equals, uint16(1)) + assert(byte(meta.Option), Equals, byte(0)) meta, err = metaReader.Read() - assert.Error(err).IsNil() - assert.Byte(byte(meta.SessionStatus)).Equals(byte(SessionStatusEnd)) - assert.Uint16(meta.SessionID).Equals(3) - assert.Byte(byte(meta.Option)).Equals(0) + assert(err, IsNil) + assert(byte(meta.SessionStatus), Equals, byte(SessionStatusEnd)) + assert(meta.SessionID, Equals, uint16(3)) + assert(byte(meta.Option), Equals, byte(0)) meta, err = metaReader.Read() - assert.Error(err).IsNil() - assert.Byte(byte(meta.SessionStatus)).Equals(byte(SessionStatusKeep)) - assert.Uint16(meta.SessionID).Equals(2) - assert.Byte(byte(meta.Option)).Equals(1) + assert(err, IsNil) + assert(byte(meta.SessionStatus), Equals, byte(SessionStatusKeep)) + assert(meta.SessionID, Equals, uint16(2)) + assert(byte(meta.Option), Equals, byte(1)) data, err = readAll(streamReader) - assert.Error(err).IsNil() - assert.Int(len(data)).Equals(1) - assert.String(data[0].String()).Equals("y") + assert(err, IsNil) + assert(len(data), Equals, 1) + assert(data[0].String(), Equals, "y") meta, err = metaReader.Read() - assert.Error(err).IsNil() - assert.Byte(byte(meta.SessionStatus)).Equals(byte(SessionStatusEnd)) - assert.Uint16(meta.SessionID).Equals(2) - assert.Byte(byte(meta.Option)).Equals(0) + assert(err, IsNil) + assert(byte(meta.SessionStatus), Equals, byte(SessionStatusEnd)) + assert(meta.SessionID, Equals, uint16(2)) + assert(byte(meta.Option), Equals, byte(0)) stream.Close() meta, err = metaReader.Read() - assert.Error(err).IsNotNil() - assert.Pointer(meta).IsNil() + assert(err, IsNotNil) + assert(meta, IsNil) } diff --git a/app/proxyman/mux/session_test.go b/app/proxyman/mux/session_test.go index 63953ecf..4acffd8f 100644 --- a/app/proxyman/mux/session_test.go +++ b/app/proxyman/mux/session_test.go @@ -4,36 +4,36 @@ import ( "testing" . "v2ray.com/core/app/proxyman/mux" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" ) func TestSessionManagerAdd(t *testing.T) { - assert := assert.On(t) + assert := With(t) m := NewSessionManager() s := m.Allocate() - assert.Uint16(s.ID).Equals(1) - assert.Int(m.Size()).Equals(1) + assert(s.ID, Equals, uint16(1)) + assert(m.Size(), Equals, 1) s = m.Allocate() - assert.Uint16(s.ID).Equals(2) - assert.Int(m.Size()).Equals(2) + assert(s.ID, Equals, uint16(2)) + assert(m.Size(), Equals, 2) s = &Session{ ID: 4, } m.Add(s) - assert.Uint16(s.ID).Equals(4) + assert(s.ID, Equals, uint16(4)) } func TestSessionManagerClose(t *testing.T) { - assert := assert.On(t) + assert := With(t) m := NewSessionManager() s := m.Allocate() - assert.Bool(m.CloseIfNoSession()).IsFalse() + assert(m.CloseIfNoSession(), IsFalse) m.Remove(s.ID) - assert.Bool(m.CloseIfNoSession()).IsTrue() + assert(m.CloseIfNoSession(), IsTrue) } diff --git a/app/router/condition_test.go b/app/router/condition_test.go index 1fec521f..f0283dc3 100644 --- a/app/router/condition_test.go +++ b/app/router/condition_test.go @@ -8,11 +8,11 @@ import ( "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/proxy" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" ) func TestSubDomainMatcher(t *testing.T) { - assert := assert.On(t) + assert := With(t) cases := []struct { pattern string @@ -47,12 +47,12 @@ func TestSubDomainMatcher(t *testing.T) { } for _, test := range cases { matcher := NewSubDomainMatcher(test.pattern) - assert.Bool(matcher.Apply(test.input) == test.output).IsTrue() + assert(matcher.Apply(test.input) == test.output, IsTrue) } } func TestRoutingRule(t *testing.T) { - assert := assert.On(t) + assert := With(t) type ruleTest struct { input context.Context @@ -172,10 +172,10 @@ func TestRoutingRule(t *testing.T) { for _, test := range cases { cond, err := test.rule.BuildCondition() - assert.Error(err).IsNil() + assert(err, IsNil) for _, t := range test.test { - assert.Bool(cond.Apply(t.input)).Equals(t.output) + assert(cond.Apply(t.input), Equals, t.output) } } } diff --git a/app/router/router_test.go b/app/router/router_test.go index e3db5cd0..12350fb9 100644 --- a/app/router/router_test.go +++ b/app/router/router_test.go @@ -14,11 +14,11 @@ import ( . "v2ray.com/core/app/router" "v2ray.com/core/common/net" "v2ray.com/core/proxy" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" ) func TestSimpleRouter(t *testing.T) { - assert := assert.On(t) + assert := With(t) config := &Config{ Rule: []*RoutingRule{ @@ -33,16 +33,16 @@ func TestSimpleRouter(t *testing.T) { space := app.NewSpace() ctx := app.ContextWithSpace(context.Background(), space) - assert.Error(app.AddApplicationToSpace(ctx, new(dns.Config))).IsNil() - assert.Error(app.AddApplicationToSpace(ctx, new(dispatcher.Config))).IsNil() - assert.Error(app.AddApplicationToSpace(ctx, new(proxyman.OutboundConfig))).IsNil() - assert.Error(app.AddApplicationToSpace(ctx, config)).IsNil() - assert.Error(space.Initialize()).IsNil() + assert(app.AddApplicationToSpace(ctx, new(dns.Config)), IsNil) + assert(app.AddApplicationToSpace(ctx, new(dispatcher.Config)), IsNil) + assert(app.AddApplicationToSpace(ctx, new(proxyman.OutboundConfig)), IsNil) + assert(app.AddApplicationToSpace(ctx, config), IsNil) + assert(space.Initialize(), IsNil) r := FromSpace(space) ctx = proxy.ContextWithTarget(ctx, net.TCPDestination(net.DomainAddress("v2ray.com"), 80)) tag, err := r.TakeDetour(ctx) - assert.Error(err).IsNil() - assert.String(tag).Equals("test") + assert(err, IsNil) + assert(tag, Equals, "test") } diff --git a/common/bitmask/byte_test.go b/common/bitmask/byte_test.go index 6e7e2e8b..2ca2a7e3 100644 --- a/common/bitmask/byte_test.go +++ b/common/bitmask/byte_test.go @@ -4,24 +4,24 @@ import ( "testing" . "v2ray.com/core/common/bitmask" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" ) func TestBitmaskByte(t *testing.T) { - assert := assert.On(t) + assert := With(t) b := Byte(0) b.Set(Byte(1)) - assert.Bool(b.Has(1)).IsTrue() + assert(b.Has(1), IsTrue) b.Set(Byte(2)) - assert.Bool(b.Has(2)).IsTrue() - assert.Bool(b.Has(1)).IsTrue() + assert(b.Has(2), IsTrue) + assert(b.Has(1), IsTrue) b.Clear(Byte(1)) - assert.Bool(b.Has(2)).IsTrue() - assert.Bool(b.Has(1)).IsFalse() + assert(b.Has(2), IsTrue) + assert(b.Has(1), IsFalse) b.Toggle(Byte(2)) - assert.Bool(b.Has(2)).IsFalse() + assert(b.Has(2), IsFalse) } diff --git a/common/buf/buffer_test.go b/common/buf/buffer_test.go index 6c0d2a50..af05057e 100644 --- a/common/buf/buffer_test.go +++ b/common/buf/buffer_test.go @@ -6,64 +6,64 @@ import ( . "v2ray.com/core/common/buf" "v2ray.com/core/common/serial" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" ) func TestBufferClear(t *testing.T) { - assert := assert.On(t) + assert := With(t) buffer := New() defer buffer.Release() payload := "Bytes" buffer.Append([]byte(payload)) - assert.Int(buffer.Len()).Equals(len(payload)) + assert(buffer.Len(), Equals, len(payload)) buffer.Clear() - assert.Int(buffer.Len()).Equals(0) + assert(buffer.Len(), Equals, 0) } func TestBufferIsEmpty(t *testing.T) { - assert := assert.On(t) + assert := With(t) buffer := New() defer buffer.Release() - assert.Bool(buffer.IsEmpty()).IsTrue() + assert(buffer.IsEmpty(), IsTrue) } func TestBufferString(t *testing.T) { - assert := assert.On(t) + assert := With(t) buffer := New() defer buffer.Release() - assert.Error(buffer.AppendSupplier(serial.WriteString("Test String"))).IsNil() - assert.String(buffer.String()).Equals("Test String") + assert(buffer.AppendSupplier(serial.WriteString("Test String")), IsNil) + assert(buffer.String(), Equals, "Test String") } func TestBufferWrite(t *testing.T) { - assert := assert.On(t) + assert := With(t) buffer := NewLocal(8) nBytes, err := buffer.Write([]byte("abcd")) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(4) + assert(err, IsNil) + assert(nBytes, Equals, 4) nBytes, err = buffer.Write([]byte("abcde")) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(4) - assert.String(buffer.String()).Equals("abcdabcd") + assert(err, IsNil) + assert(nBytes, Equals, 4) + assert(buffer.String(), Equals, "abcdabcd") } func TestSyncPool(t *testing.T) { - assert := assert.On(t) + assert := With(t) p := NewSyncPool(32) b := p.Allocate() - assert.Int(b.Len()).Equals(0) + assert(b.Len(), Equals, 0) - assert.Error(b.AppendSupplier(ReadFrom(rand.Reader))).IsNil() - assert.Int(b.Len()).Equals(32) + assert(b.AppendSupplier(ReadFrom(rand.Reader)), IsNil) + assert(b.Len(), Equals, 32) b.Release() } diff --git a/common/buf/buffered_reader_test.go b/common/buf/buffered_reader_test.go index 1c073153..7d23e407 100644 --- a/common/buf/buffered_reader_test.go +++ b/common/buf/buffered_reader_test.go @@ -5,32 +5,32 @@ import ( "testing" . "v2ray.com/core/common/buf" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" ) func TestBufferedReader(t *testing.T) { - assert := assert.On(t) + assert := With(t) content := New() - assert.Error(content.AppendSupplier(ReadFrom(rand.Reader))).IsNil() + assert(content.AppendSupplier(ReadFrom(rand.Reader)), IsNil) len := content.Len() reader := NewBufferedReader(content) - assert.Bool(reader.IsBuffered()).IsTrue() + assert(reader.IsBuffered(), IsTrue) payload := make([]byte, 16) nBytes, err := reader.Read(payload) - assert.Int(nBytes).Equals(16) - assert.Error(err).IsNil() + assert(nBytes, Equals, 16) + assert(err, IsNil) len2 := content.Len() - assert.Int(len - len2).GreaterThan(16) + assert(len - len2, GreaterThan, 16) nBytes, err = reader.Read(payload) - assert.Int(nBytes).Equals(16) - assert.Error(err).IsNil() + assert(nBytes, Equals, 16) + assert(err, IsNil) - assert.Int(content.Len()).Equals(len2) + assert(content.Len(), Equals, len2) } diff --git a/common/buf/buffered_writer_test.go b/common/buf/buffered_writer_test.go index 97cb923b..12154ee6 100644 --- a/common/buf/buffered_writer_test.go +++ b/common/buf/buffered_writer_test.go @@ -6,49 +6,49 @@ import ( "v2ray.com/core/common" . "v2ray.com/core/common/buf" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" ) func TestBufferedWriter(t *testing.T) { - assert := assert.On(t) + assert := With(t) content := New() writer := NewBufferedWriter(content) - assert.Bool(writer.IsBuffered()).IsTrue() + assert(writer.IsBuffered(), IsTrue) payload := make([]byte, 16) nBytes, err := writer.Write(payload) - assert.Int(nBytes).Equals(16) - assert.Error(err).IsNil() + assert(nBytes, Equals, 16) + assert(err, IsNil) - assert.Bool(content.IsEmpty()).IsTrue() + assert(content.IsEmpty(), IsTrue) - assert.Error(writer.SetBuffered(false)).IsNil() - assert.Int(content.Len()).Equals(16) + assert(writer.SetBuffered(false), IsNil) + assert(content.Len(), Equals, 16) } func TestBufferedWriterLargePayload(t *testing.T) { - assert := assert.On(t) + assert := With(t) content := NewLocal(128 * 1024) writer := NewBufferedWriter(content) - assert.Bool(writer.IsBuffered()).IsTrue() + assert(writer.IsBuffered(), IsTrue) payload := make([]byte, 64*1024) common.Must2(rand.Read(payload)) nBytes, err := writer.Write(payload[:512]) - assert.Int(nBytes).Equals(512) - assert.Error(err).IsNil() + assert(nBytes, Equals, 512) + assert(err, IsNil) - assert.Bool(content.IsEmpty()).IsTrue() + assert(content.IsEmpty(), IsTrue) nBytes, err = writer.Write(payload[512:]) - assert.Error(err).IsNil() - assert.Error(writer.Flush()).IsNil() - assert.Int(nBytes).Equals(64*1024 - 512) - assert.Bytes(content.Bytes()).Equals(payload) + assert(err, IsNil) + assert(writer.Flush(), IsNil) + assert(nBytes, Equals, 64*1024 - 512) + assert(content.Bytes(), Equals, payload) } diff --git a/common/buf/multi_buffer_test.go b/common/buf/multi_buffer_test.go index bf7059d4..92df32f0 100644 --- a/common/buf/multi_buffer_test.go +++ b/common/buf/multi_buffer_test.go @@ -4,11 +4,11 @@ import ( "testing" . "v2ray.com/core/common/buf" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" ) func TestMultiBufferRead(t *testing.T) { - assert := assert.On(t) + assert := With(t) b1 := New() b1.AppendBytes('a', 'b') @@ -19,17 +19,17 @@ func TestMultiBufferRead(t *testing.T) { bs := make([]byte, 32) nBytes, err := mb.Read(bs) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(4) - assert.Bytes(bs[:nBytes]).Equals([]byte("abcd")) + assert(err, IsNil) + assert(nBytes, Equals, 4) + assert(bs[:nBytes], Equals, []byte("abcd")) } func TestMultiBufferAppend(t *testing.T) { - assert := assert.On(t) + assert := With(t) var mb MultiBuffer b := New() b.AppendBytes('a', 'b') mb.Append(b) - assert.Int(mb.Len()).Equals(2) + assert(mb.Len(), Equals, 2) } diff --git a/common/buf/reader_test.go b/common/buf/reader_test.go index cb1e6567..7c79d0fd 100644 --- a/common/buf/reader_test.go +++ b/common/buf/reader_test.go @@ -7,24 +7,24 @@ import ( "testing" . "v2ray.com/core/common/buf" - "v2ray.com/core/testing/assert" "v2ray.com/core/transport/ray" + . "v2ray.com/ext/assert" ) func TestAdaptiveReader(t *testing.T) { - assert := assert.On(t) + assert := With(t) rawContent := make([]byte, 1024*1024) buffer := bytes.NewBuffer(rawContent) reader := NewReader(buffer) b, err := reader.Read() - assert.Error(err).IsNil() - assert.Int(b.Len()).Equals(32 * 1024) + assert(err, IsNil) + assert(b.Len(), Equals, 32*1024) } func TestBytesReaderWriteTo(t *testing.T) { - assert := assert.On(t) + assert := With(t) stream := ray.NewStream(context.Background()) reader := ToBytesReader(stream) @@ -32,25 +32,25 @@ func TestBytesReaderWriteTo(t *testing.T) { b1.AppendBytes('a', 'b', 'c') b2 := New() b2.AppendBytes('e', 'f', 'g') - assert.Error(stream.Write(NewMultiBufferValue(b1, b2))).IsNil() + assert(stream.Write(NewMultiBufferValue(b1, b2)), IsNil) stream.Close() stream2 := ray.NewStream(context.Background()) writer := ToBytesWriter(stream2) nBytes, err := io.Copy(writer, reader) - assert.Error(err).IsNil() - assert.Int64(nBytes).Equals(6) + assert(err, IsNil) + assert(nBytes, Equals, int64(6)) mb, err := stream2.Read() - assert.Error(err).IsNil() - assert.Int(len(mb)).Equals(2) - assert.String(mb[0].String()).Equals("abc") - assert.String(mb[1].String()).Equals("efg") + assert(err, IsNil) + assert(len(mb), Equals, 2) + assert(mb[0].String(), Equals, "abc") + assert(mb[1].String(), Equals, "efg") } func TestBytesReaderMultiBuffer(t *testing.T) { - assert := assert.On(t) + assert := With(t) stream := ray.NewStream(context.Background()) reader := ToBytesReader(stream) @@ -58,13 +58,13 @@ func TestBytesReaderMultiBuffer(t *testing.T) { b1.AppendBytes('a', 'b', 'c') b2 := New() b2.AppendBytes('e', 'f', 'g') - assert.Error(stream.Write(NewMultiBufferValue(b1, b2))).IsNil() + assert(stream.Write(NewMultiBufferValue(b1, b2)), IsNil) stream.Close() mbReader := NewReader(reader) mb, err := mbReader.Read() - assert.Error(err).IsNil() - assert.Int(len(mb)).Equals(2) - assert.String(mb[0].String()).Equals("abc") - assert.String(mb[1].String()).Equals("efg") + assert(err, IsNil) + assert(len(mb), Equals, 2) + assert(mb[0].String(), Equals, "abc") + assert(mb[1].String(), Equals, "efg") } diff --git a/common/buf/writer_test.go b/common/buf/writer_test.go index afa0d8cd..b9100690 100644 --- a/common/buf/writer_test.go +++ b/common/buf/writer_test.go @@ -10,15 +10,15 @@ import ( "io" . "v2ray.com/core/common/buf" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" "v2ray.com/core/transport/ray" ) func TestWriter(t *testing.T) { - assert := assert.On(t) + assert := With(t) lb := New() - assert.Error(lb.AppendSupplier(ReadFrom(rand.Reader))).IsNil() + assert(lb.AppendSupplier(ReadFrom(rand.Reader)), IsNil) expectedBytes := append([]byte(nil), lb.Bytes()...) @@ -26,20 +26,20 @@ func TestWriter(t *testing.T) { writer := NewWriter(NewBufferedWriter(writeBuffer)) err := writer.Write(NewMultiBufferValue(lb)) - assert.Error(err).IsNil() - assert.Bytes(expectedBytes).Equals(writeBuffer.Bytes()) + assert(err, IsNil) + assert(expectedBytes, Equals, writeBuffer.Bytes()) } func TestBytesWriterReadFrom(t *testing.T) { - assert := assert.On(t) + assert := With(t) cache := ray.NewStream(context.Background()) reader := bufio.NewReader(io.LimitReader(rand.Reader, 8192)) _, err := reader.WriteTo(ToBytesWriter(cache)) - assert.Error(err).IsNil() + assert(err, IsNil) mb, err := cache.Read() - assert.Error(err).IsNil() - assert.Int(mb.Len()).Equals(8192) - assert.Int(len(mb)).Equals(4) + assert(err, IsNil) + assert(mb.Len(), Equals, 8192) + assert(len(mb), Equals, 4) } diff --git a/common/crypto/auth_test.go b/common/crypto/auth_test.go index a44ecfbf..cd10b1b6 100644 --- a/common/crypto/auth_test.go +++ b/common/crypto/auth_test.go @@ -10,19 +10,19 @@ import ( "v2ray.com/core/common/buf" . "v2ray.com/core/common/crypto" "v2ray.com/core/common/protocol" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" ) func TestAuthenticationReaderWriter(t *testing.T) { - assert := assert.On(t) + assert := With(t) key := make([]byte, 16) rand.Read(key) block, err := aes.NewCipher(key) - assert.Error(err).IsNil() + assert(err, IsNil) aead, err := cipher.NewGCM(block) - assert.Error(err).IsNil() + assert(err, IsNil) rawPayload := make([]byte, 8192*10) rand.Read(rawPayload) @@ -42,10 +42,10 @@ func TestAuthenticationReaderWriter(t *testing.T) { AdditionalDataGenerator: &NoOpBytesGenerator{}, }, PlainChunkSizeParser{}, cache, protocol.TransferTypeStream) - assert.Error(writer.Write(buf.NewMultiBufferValue(payload))).IsNil() - assert.Int(cache.Len()).Equals(83360) - assert.Error(writer.Write(buf.NewMultiBuffer())).IsNil() - assert.Error(err).IsNil() + assert(writer.Write(buf.NewMultiBufferValue(payload)), IsNil) + assert(cache.Len(), Equals, 83360) + assert(writer.Write(buf.NewMultiBuffer()), IsNil) + assert(err, IsNil) reader := NewAuthenticationReader(&AEADAuthenticator{ AEAD: aead, @@ -59,29 +59,29 @@ func TestAuthenticationReaderWriter(t *testing.T) { for mb.Len() < len(rawPayload) { mb2, err := reader.Read() - assert.Error(err).IsNil() + assert(err, IsNil) mb.AppendMulti(mb2) } mbContent := make([]byte, 8192*10) mb.Read(mbContent) - assert.Bytes(mbContent).Equals(rawPayload) + assert(mbContent, Equals, rawPayload) _, err = reader.Read() - assert.Error(err).Equals(io.EOF) + assert(err, Equals, io.EOF) } func TestAuthenticationReaderWriterPacket(t *testing.T) { - assert := assert.On(t) + assert := With(t) key := make([]byte, 16) rand.Read(key) block, err := aes.NewCipher(key) - assert.Error(err).IsNil() + assert(err, IsNil) aead, err := cipher.NewGCM(block) - assert.Error(err).IsNil() + assert(err, IsNil) cache := buf.NewLocal(1024) iv := make([]byte, 12) @@ -104,10 +104,10 @@ func TestAuthenticationReaderWriterPacket(t *testing.T) { pb2.Append([]byte("efgh")) payload.Append(pb2) - assert.Error(writer.Write(payload)).IsNil() - assert.Int(cache.Len()).GreaterThan(0) - assert.Error(writer.Write(buf.NewMultiBuffer())).IsNil() - assert.Error(err).IsNil() + assert(writer.Write(payload), IsNil) + assert(cache.Len(), GreaterThan, 0) + assert(writer.Write(buf.NewMultiBuffer()), IsNil) + assert(err, IsNil) reader := NewAuthenticationReader(&AEADAuthenticator{ AEAD: aead, @@ -118,14 +118,14 @@ func TestAuthenticationReaderWriterPacket(t *testing.T) { }, PlainChunkSizeParser{}, cache, protocol.TransferTypePacket) mb, err := reader.Read() - assert.Error(err).IsNil() + assert(err, IsNil) b1 := mb.SplitFirst() - assert.String(b1.String()).Equals("abcd") + assert(b1.String(), Equals, "abcd") b2 := mb.SplitFirst() - assert.String(b2.String()).Equals("efgh") - assert.Bool(mb.IsEmpty()).IsTrue() + assert(b2.String(), Equals, "efgh") + assert(mb.IsEmpty(), IsTrue) _, err = reader.Read() - assert.Error(err).Equals(io.EOF) + assert(err, Equals, io.EOF) } diff --git a/common/crypto/chacha20_test.go b/common/crypto/chacha20_test.go index 7bca32a9..40ea44c3 100644 --- a/common/crypto/chacha20_test.go +++ b/common/crypto/chacha20_test.go @@ -7,7 +7,7 @@ import ( "v2ray.com/core/common" . "v2ray.com/core/common/crypto" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" ) func mustDecodeHex(s string) []byte { @@ -17,7 +17,7 @@ func mustDecodeHex(s string) []byte { } func TestChaCha20Stream(t *testing.T) { - assert := assert.On(t) + assert := With(t) var cases = []struct { key []byte @@ -51,12 +51,12 @@ func TestChaCha20Stream(t *testing.T) { input := make([]byte, len(c.output)) actualOutout := make([]byte, len(c.output)) s.XORKeyStream(actualOutout, input) - assert.Bytes(c.output).Equals(actualOutout) + assert(c.output, Equals, actualOutout) } } func TestChaCha20Decoding(t *testing.T) { - assert := assert.On(t) + assert := With(t) key := make([]byte, 32) rand.Read(key) @@ -72,5 +72,5 @@ func TestChaCha20Decoding(t *testing.T) { stream2 := NewChaCha20Stream(key, iv) stream2.XORKeyStream(x, x) - assert.Bytes(x).Equals(payload) + assert(x, Equals, payload) } diff --git a/common/crypto/chunk_test.go b/common/crypto/chunk_test.go index e9f399b0..67144dce 100644 --- a/common/crypto/chunk_test.go +++ b/common/crypto/chunk_test.go @@ -6,11 +6,11 @@ import ( "v2ray.com/core/common/buf" . "v2ray.com/core/common/crypto" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" ) func TestChunkStreamIO(t *testing.T) { - assert := assert.On(t) + assert := With(t) cache := buf.NewLocal(8192) @@ -19,26 +19,26 @@ func TestChunkStreamIO(t *testing.T) { b := buf.New() b.AppendBytes('a', 'b', 'c', 'd') - assert.Error(writer.Write(buf.NewMultiBufferValue(b))).IsNil() + assert(writer.Write(buf.NewMultiBufferValue(b)), IsNil) b = buf.New() b.AppendBytes('e', 'f', 'g') - assert.Error(writer.Write(buf.NewMultiBufferValue(b))).IsNil() + assert(writer.Write(buf.NewMultiBufferValue(b)), IsNil) - assert.Error(writer.Write(buf.NewMultiBuffer())).IsNil() + assert(writer.Write(buf.NewMultiBuffer()), IsNil) - assert.Int(cache.Len()).Equals(13) + assert(cache.Len(), Equals, 13) mb, err := reader.Read() - assert.Error(err).IsNil() - assert.Int(mb.Len()).Equals(4) - assert.Bytes(mb[0].Bytes()).Equals([]byte("abcd")) + assert(err, IsNil) + assert(mb.Len(), Equals, 4) + assert(mb[0].Bytes(), Equals, []byte("abcd")) mb, err = reader.Read() - assert.Error(err).IsNil() - assert.Int(mb.Len()).Equals(3) - assert.Bytes(mb[0].Bytes()).Equals([]byte("efg")) + assert(err, IsNil) + assert(mb.Len(), Equals, 3) + assert(mb[0].Bytes(), Equals, []byte("efg")) _, err = reader.Read() - assert.Error(err).Equals(io.EOF) + assert(err, Equals, io.EOF) } diff --git a/common/errors/errors_test.go b/common/errors/errors_test.go index cb385fbd..337e3c9d 100644 --- a/common/errors/errors_test.go +++ b/common/errors/errors_test.go @@ -5,29 +5,29 @@ import ( "testing" . "v2ray.com/core/common/errors" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" ) func TestError(t *testing.T) { - assert := assert.On(t) + assert := With(t) err := New("TestError") - assert.Bool(GetSeverity(err) == SeverityInfo).IsTrue() + assert(GetSeverity(err), Equals, SeverityInfo) err = New("TestError2").Base(io.EOF) - assert.Bool(GetSeverity(err) == SeverityInfo).IsTrue() + assert(GetSeverity(err), Equals, SeverityInfo) err = New("TestError3").Base(io.EOF).AtWarning() - assert.Bool(GetSeverity(err) == SeverityWarning).IsTrue() + assert(GetSeverity(err), Equals, SeverityWarning) err = New("TestError4").Base(io.EOF).AtWarning() err = New("TestError5").Base(err) - assert.Bool(GetSeverity(err) == SeverityWarning).IsTrue() - assert.String(err.Error()).Contains("EOF") + assert(GetSeverity(err), Equals, SeverityWarning) + assert(err.Error(), HasSubstring, "EOF") } func TestErrorMessage(t *testing.T) { - assert := assert.On(t) + assert := With(t) data := []struct { err error @@ -44,6 +44,6 @@ func TestErrorMessage(t *testing.T) { } for _, d := range data { - assert.String(d.err.Error()).Equals(d.msg) + assert(d.err.Error(), Equals, d.msg) } } diff --git a/common/net/address_test.go b/common/net/address_test.go index 58583d24..3f5fcb42 100644 --- a/common/net/address_test.go +++ b/common/net/address_test.go @@ -6,7 +6,6 @@ import ( . "v2ray.com/core/common/net" . "v2ray.com/core/common/net/testing" - "v2ray.com/core/testing/assert" . "v2ray.com/ext/assert" ) @@ -24,7 +23,7 @@ func TestIPv4Address(t *testing.T) { } func TestIPv6Address(t *testing.T) { - assert := assert.On(t) + assert := With(t) ip := []byte{ byte(1), byte(2), byte(3), byte(4), @@ -34,15 +33,15 @@ func TestIPv6Address(t *testing.T) { } addr := IPAddress(ip) - assert.Address(addr).IsIPv6() - assert.Address(addr).IsNotIPv4() - assert.Address(addr).IsNotDomain() - assert.IP(addr.IP()).Equals(net.IP(ip)) - assert.Address(addr).EqualsString("[102:304:102:304:102:304:102:304]") + assert(addr, IsIPv6) + assert(addr, Not(IsIPv4)) + assert(addr, Not(IsDomain)) + assert(addr.IP(), Equals, net.IP(ip)) + assert(addr.String(), Equals, "[102:304:102:304:102:304:102:304]") } func TestIPv4Asv6(t *testing.T) { - assert := assert.On(t) + assert := With(t) ip := []byte{ byte(0), byte(0), byte(0), byte(0), byte(0), byte(0), byte(0), byte(0), @@ -50,27 +49,27 @@ func TestIPv4Asv6(t *testing.T) { byte(1), byte(2), byte(3), byte(4), } addr := IPAddress(ip) - assert.Address(addr).EqualsString("1.2.3.4") + assert(addr.String(), Equals, "1.2.3.4") } func TestDomainAddress(t *testing.T) { - assert := assert.On(t) + assert := With(t) domain := "v2ray.com" addr := DomainAddress(domain) - assert.Address(addr).IsDomain() - assert.Address(addr).IsNotIPv6() - assert.Address(addr).IsNotIPv4() - assert.String(addr.Domain()).Equals(domain) - assert.Address(addr).EqualsString("v2ray.com") + assert(addr, IsDomain) + assert(addr, Not(IsIPv6)) + assert(addr, Not(IsIPv4)) + assert(addr.Domain(), Equals, domain) + assert(addr.String(), Equals, "v2ray.com") } func TestNetIPv4Address(t *testing.T) { - assert := assert.On(t) + assert := With(t) ip := net.IPv4(1, 2, 3, 4) addr := IPAddress(ip) - assert.Address(addr).IsIPv4() - assert.Address(addr).EqualsString("1.2.3.4") + assert(addr, IsIPv4) + assert(addr.String(), Equals, "1.2.3.4") } diff --git a/common/net/destination_test.go b/common/net/destination_test.go index f3b0f131..b68e9ccb 100644 --- a/common/net/destination_test.go +++ b/common/net/destination_test.go @@ -4,23 +4,24 @@ import ( "testing" . "v2ray.com/core/common/net" - "v2ray.com/core/testing/assert" + . "v2ray.com/core/common/net/testing" + . "v2ray.com/ext/assert" ) func TestTCPDestination(t *testing.T) { - assert := assert.On(t) + assert := With(t) dest := TCPDestination(IPAddress([]byte{1, 2, 3, 4}), 80) - assert.Destination(dest).IsTCP() - assert.Destination(dest).IsNotUDP() - assert.Destination(dest).EqualsString("tcp:1.2.3.4:80") + assert(dest, IsTCP) + assert(dest, Not(IsUDP)) + assert(dest.String(), Equals, "tcp:1.2.3.4:80") } func TestUDPDestination(t *testing.T) { - assert := assert.On(t) + assert := With(t) dest := UDPDestination(IPAddress([]byte{0x20, 0x01, 0x48, 0x60, 0x48, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88}), 53) - assert.Destination(dest).IsNotTCP() - assert.Destination(dest).IsUDP() - assert.Destination(dest).EqualsString("udp:[2001:4860:4860::8888]:53") + assert(dest, Not(IsTCP)) + assert(dest, IsUDP) + assert(dest.String(), Equals, "udp:[2001:4860:4860::8888]:53") } diff --git a/common/net/ipnet_test.go b/common/net/ipnet_test.go index e9261603..132dca9b 100644 --- a/common/net/ipnet_test.go +++ b/common/net/ipnet_test.go @@ -6,7 +6,7 @@ import ( "v2ray.com/core/common" . "v2ray.com/core/common/net" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" ) func parseCIDR(str string) *net.IPNet { @@ -16,7 +16,7 @@ func parseCIDR(str string) *net.IPNet { } func TestIPNet(t *testing.T) { - assert := assert.On(t) + assert := With(t) ipNet := NewIPNetTable() ipNet.Add(parseCIDR(("0.0.0.0/8"))) @@ -32,12 +32,12 @@ func TestIPNet(t *testing.T) { ipNet.Add(parseCIDR(("198.51.100.0/24"))) ipNet.Add(parseCIDR(("203.0.113.0/24"))) ipNet.Add(parseCIDR(("8.8.8.8/32"))) - assert.Bool(ipNet.Contains(ParseIP("192.168.1.1"))).IsTrue() - assert.Bool(ipNet.Contains(ParseIP("192.0.0.0"))).IsTrue() - assert.Bool(ipNet.Contains(ParseIP("192.0.1.0"))).IsFalse() - assert.Bool(ipNet.Contains(ParseIP("0.1.0.0"))).IsTrue() - assert.Bool(ipNet.Contains(ParseIP("1.0.0.1"))).IsFalse() - assert.Bool(ipNet.Contains(ParseIP("8.8.8.7"))).IsFalse() - assert.Bool(ipNet.Contains(ParseIP("8.8.8.8"))).IsTrue() - assert.Bool(ipNet.Contains(ParseIP("2001:cdba::3257:9652"))).IsFalse() + assert(ipNet.Contains(ParseIP("192.168.1.1")), IsTrue) + assert(ipNet.Contains(ParseIP("192.0.0.0")), IsTrue) + assert(ipNet.Contains(ParseIP("192.0.1.0")), IsFalse) + assert(ipNet.Contains(ParseIP("0.1.0.0")), IsTrue) + assert(ipNet.Contains(ParseIP("1.0.0.1")), IsFalse) + assert(ipNet.Contains(ParseIP("8.8.8.7")), IsFalse) + assert(ipNet.Contains(ParseIP("8.8.8.8")), IsTrue) + assert(ipNet.Contains(ParseIP("2001:cdba::3257:9652")), IsFalse) } diff --git a/common/net/port_test.go b/common/net/port_test.go index a1f1f4e2..187cdf1f 100644 --- a/common/net/port_test.go +++ b/common/net/port_test.go @@ -4,15 +4,15 @@ import ( "testing" . "v2ray.com/core/common/net" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" ) func TestPortRangeContains(t *testing.T) { - assert := assert.On(t) + assert := With(t) portRange := &PortRange{ From: 53, To: 53, } - assert.Bool(portRange.Contains(Port(53))).IsTrue() + assert(portRange.Contains(Port(53)), IsTrue) } diff --git a/common/net/testing/assert.go b/common/net/testing/assert.go index 16c9f5aa..b6eb2fb9 100644 --- a/common/net/testing/assert.go +++ b/common/net/testing/assert.go @@ -1,46 +1,48 @@ package testing import ( - "reflect" - "v2ray.com/core/common/net" "v2ray.com/ext/assert" ) -var IsIPv4 = assert.CreateMatcher(reflect.TypeOf(net.Address(nil)), reflect.ValueOf(func(a net.Address) bool { +var IsIPv4 = assert.CreateMatcher(func(a net.Address) bool { return a.Family().IsIPv4() -}), 1, "is IPv4") +}, "is IPv4") -var IsIPv6 = assert.CreateMatcher(reflect.TypeOf(net.Address(nil)), reflect.ValueOf(func(a net.Address) bool { +var IsIPv6 = assert.CreateMatcher(func(a net.Address) bool { return a.Family().IsIPv6() -}), 1, "is IPv6") +}, "is IPv6") -var IsIP = assert.CreateMatcher(reflect.TypeOf(net.Address(nil)), reflect.ValueOf(func(a net.Address) bool { +var IsIP = assert.CreateMatcher(func(a net.Address) bool { return a.Family().IsIPv4() || a.Family().IsIPv6() -}), 1, "is IP") +}, "is IP") -var IsTCP = assert.CreateMatcher(reflect.TypeOf(net.Destination{}), reflect.ValueOf(func(a net.Destination) bool { +var IsTCP = assert.CreateMatcher(func(a net.Destination) bool { return a.Network == net.Network_TCP -}), 1, "is TCP") +}, "is TCP") -var IsUDP = assert.CreateMatcher(reflect.TypeOf(net.Destination{}), reflect.ValueOf(func(a net.Destination) bool { +var IsUDP = assert.CreateMatcher(func(a net.Destination) bool { return a.Network == net.Network_UDP -}), 1, "is UDP") +}, "is UDP") -var IsDomain = assert.CreateMatcher(reflect.TypeOf(net.Address(nil)), reflect.ValueOf(func(a net.Address) bool { +var IsDomain = assert.CreateMatcher(func(a net.Address) bool { return a.Family().IsDomain() -}), 1, "is Domain") +}, "is Domain") func init() { - assert.RegisterEqualsMatcher(reflect.TypeOf((*net.Address)(nil)).Elem(), reflect.ValueOf(func(a, b net.Address) bool { + assert.RegisterEqualsMatcher(func(a, b net.Address) bool { return a == b - })) + }) - assert.RegisterEqualsMatcher(reflect.TypeOf(net.Destination{}), reflect.ValueOf(func(a, b net.Destination) bool { + assert.RegisterEqualsMatcher(func(a, b net.Destination) bool { return a == b - })) + }) - assert.RegisterEqualsMatcher(reflect.TypeOf(net.Port(0)), reflect.ValueOf(func(a, b net.Port) bool { + assert.RegisterEqualsMatcher(func(a, b net.Port) bool { return a == b - })) + }) + + assert.RegisterEqualsMatcher(func(a, b net.IP) bool { + return a.Equal(b) + }) } diff --git a/common/platform/platform_test.go b/common/platform/platform_test.go index 4b3d6e6f..6eb52acd 100644 --- a/common/platform/platform_test.go +++ b/common/platform/platform_test.go @@ -4,11 +4,11 @@ import ( "testing" . "v2ray.com/core/common/platform" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" ) func TestNormalizeEnvName(t *testing.T) { - assert := assert.On(t) + assert := With(t) cases := []struct { input string @@ -28,14 +28,14 @@ func TestNormalizeEnvName(t *testing.T) { }, } for _, test := range cases { - assert.String(NormalizeEnvName(test.input)).Equals(test.output) + assert(NormalizeEnvName(test.input), Equals, test.output) } } func TestEnvFlag(t *testing.T) { - assert := assert.On(t) + assert := With(t) - assert.Int(EnvFlag{ + assert(EnvFlag{ Name: "xxxxx.y", - }.GetValueAsInt(10)).Equals(10) + }.GetValueAsInt(10), Equals, 10) } diff --git a/common/protocol/id_test.go b/common/protocol/id_test.go index 12788529..81bf5063 100644 --- a/common/protocol/id_test.go +++ b/common/protocol/id_test.go @@ -6,12 +6,12 @@ import ( "v2ray.com/core/common/predicate" . "v2ray.com/core/common/protocol" "v2ray.com/core/common/uuid" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" ) func TestCmdKey(t *testing.T) { - assert := assert.On(t) + assert := With(t) id := NewID(uuid.New()) - assert.Bool(predicate.BytesAll(id.CmdKey(), 0)).IsFalse() + assert(predicate.BytesAll(id.CmdKey(), 0), IsFalse) } diff --git a/common/protocol/server_picker_test.go b/common/protocol/server_picker_test.go index 2b1bd6fe..72e789ee 100644 --- a/common/protocol/server_picker_test.go +++ b/common/protocol/server_picker_test.go @@ -6,30 +6,30 @@ import ( "v2ray.com/core/common/net" . "v2ray.com/core/common/protocol" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" ) func TestServerList(t *testing.T) { - assert := assert.On(t) + assert := With(t) list := NewServerList() list.AddServer(NewServerSpec(net.TCPDestination(net.LocalHostIP, net.Port(1)), AlwaysValid())) - assert.Uint32(list.Size()).Equals(1) + assert(list.Size(), Equals, uint32(1)) list.AddServer(NewServerSpec(net.TCPDestination(net.LocalHostIP, net.Port(2)), BeforeTime(time.Now().Add(time.Second)))) - assert.Uint32(list.Size()).Equals(2) + assert(list.Size(), Equals, uint32(2)) server := list.GetServer(1) - assert.Port(server.Destination().Port).Equals(2) + assert(server.Destination().Port, Equals, net.Port(2)) time.Sleep(2 * time.Second) server = list.GetServer(1) - assert.Pointer(server).IsNil() + assert(server, IsNil) server = list.GetServer(0) - assert.Port(server.Destination().Port).Equals(1) + assert(server.Destination().Port, Equals, net.Port(1)) } func TestServerPicker(t *testing.T) { - assert := assert.On(t) + assert := With(t) list := NewServerList() list.AddServer(NewServerSpec(net.TCPDestination(net.LocalHostIP, net.Port(1)), AlwaysValid())) @@ -38,17 +38,17 @@ func TestServerPicker(t *testing.T) { picker := NewRoundRobinServerPicker(list) server := picker.PickServer() - assert.Port(server.Destination().Port).Equals(1) + assert(server.Destination().Port, Equals, net.Port(1)) server = picker.PickServer() - assert.Port(server.Destination().Port).Equals(2) + assert(server.Destination().Port, Equals, net.Port(2)) server = picker.PickServer() - assert.Port(server.Destination().Port).Equals(3) + assert(server.Destination().Port, Equals, net.Port(3)) server = picker.PickServer() - assert.Port(server.Destination().Port).Equals(1) + assert(server.Destination().Port, Equals, net.Port(1)) time.Sleep(2 * time.Second) server = picker.PickServer() - assert.Port(server.Destination().Port).Equals(1) + assert(server.Destination().Port, Equals, net.Port(1)) server = picker.PickServer() - assert.Port(server.Destination().Port).Equals(1) + assert(server.Destination().Port, Equals, net.Port(1)) } diff --git a/common/protocol/server_spec_test.go b/common/protocol/server_spec_test.go index beca89b9..0c1a6252 100644 --- a/common/protocol/server_spec_test.go +++ b/common/protocol/server_spec_test.go @@ -5,27 +5,27 @@ import ( "time" . "v2ray.com/core/common/protocol" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" ) func TestAlwaysValidStrategy(t *testing.T) { - assert := assert.On(t) + assert := With(t) strategy := AlwaysValid() - assert.Bool(strategy.IsValid()).IsTrue() + assert(strategy.IsValid(), IsTrue) strategy.Invalidate() - assert.Bool(strategy.IsValid()).IsTrue() + assert(strategy.IsValid(), IsTrue) } func TestTimeoutValidStrategy(t *testing.T) { - assert := assert.On(t) + assert := With(t) strategy := BeforeTime(time.Now().Add(2 * time.Second)) - assert.Bool(strategy.IsValid()).IsTrue() + assert(strategy.IsValid(), IsTrue) time.Sleep(3 * time.Second) - assert.Bool(strategy.IsValid()).IsFalse() + assert(strategy.IsValid(), IsFalse) strategy = BeforeTime(time.Now().Add(2 * time.Second)) strategy.Invalidate() - assert.Bool(strategy.IsValid()).IsFalse() + assert(strategy.IsValid(), IsFalse) } diff --git a/common/protocol/time_test.go b/common/protocol/time_test.go index 1ee1084f..8ed761e5 100644 --- a/common/protocol/time_test.go +++ b/common/protocol/time_test.go @@ -5,11 +5,11 @@ import ( "time" . "v2ray.com/core/common/protocol" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" ) func TestGenerateRandomInt64InRange(t *testing.T) { - assert := assert.On(t) + assert := With(t) base := time.Now().Unix() delta := 100 @@ -17,7 +17,7 @@ func TestGenerateRandomInt64InRange(t *testing.T) { for i := 0; i < 100; i++ { val := int64(generator()) - assert.Int64(val).AtMost(base + int64(delta)) - assert.Int64(val).AtLeast(base - int64(delta)) + assert(val, AtMost, base + int64(delta)) + assert(val, AtLeast, base - int64(delta)) } } diff --git a/common/retry/retry_test.go b/common/retry/retry_test.go index 23dd249e..a08ec841 100644 --- a/common/retry/retry_test.go +++ b/common/retry/retry_test.go @@ -6,7 +6,7 @@ import ( "v2ray.com/core/common/errors" . "v2ray.com/core/common/retry" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" ) var ( @@ -14,7 +14,7 @@ var ( ) func TestNoRetry(t *testing.T) { - assert := assert.On(t) + assert := With(t) startTime := time.Now().Unix() err := Timed(10, 100000).On(func() error { @@ -22,12 +22,12 @@ func TestNoRetry(t *testing.T) { }) endTime := time.Now().Unix() - assert.Error(err).IsNil() - assert.Int64(endTime - startTime).AtLeast(0) + assert(err, IsNil) + assert(endTime-startTime, AtLeast, int64(0)) } func TestRetryOnce(t *testing.T) { - assert := assert.On(t) + assert := With(t) startTime := time.Now() called := 0 @@ -40,12 +40,12 @@ func TestRetryOnce(t *testing.T) { }) duration := time.Since(startTime) - assert.Error(err).IsNil() - assert.Int64(int64(duration / time.Millisecond)).AtLeast(900) + assert(err, IsNil) + assert(int64(duration/time.Millisecond), AtLeast, int64(900)) } func TestRetryMultiple(t *testing.T) { - assert := assert.On(t) + assert := With(t) startTime := time.Now() called := 0 @@ -58,12 +58,12 @@ func TestRetryMultiple(t *testing.T) { }) duration := time.Since(startTime) - assert.Error(err).IsNil() - assert.Int64(int64(duration / time.Millisecond)).AtLeast(4900) + assert(err, IsNil) + assert(int64(duration/time.Millisecond), AtLeast, int64(4900)) } func TestRetryExhausted(t *testing.T) { - assert := assert.On(t) + assert := With(t) startTime := time.Now() called := 0 @@ -73,12 +73,12 @@ func TestRetryExhausted(t *testing.T) { }) duration := time.Since(startTime) - assert.Error(errors.Cause(err)).Equals(ErrRetryFailed) - assert.Int64(int64(duration / time.Millisecond)).AtLeast(1900) + assert(errors.Cause(err), Equals, ErrRetryFailed) + assert(int64(duration/time.Millisecond), AtLeast, int64(1900)) } func TestExponentialBackoff(t *testing.T) { - assert := assert.On(t) + assert := With(t) startTime := time.Now() called := 0 @@ -88,6 +88,6 @@ func TestExponentialBackoff(t *testing.T) { }) duration := time.Since(startTime) - assert.Error(errors.Cause(err)).Equals(ErrRetryFailed) - assert.Int64(int64(duration / time.Millisecond)).AtLeast(4000) + assert(errors.Cause(err), Equals, ErrRetryFailed) + assert(int64(duration/time.Millisecond), AtLeast, int64(4000)) } diff --git a/common/serial/bytes_test.go b/common/serial/bytes_test.go index a873395c..65245f9e 100644 --- a/common/serial/bytes_test.go +++ b/common/serial/bytes_test.go @@ -4,11 +4,11 @@ import ( "testing" . "v2ray.com/core/common/serial" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" ) func TestBytesToHex(t *testing.T) { - assert := assert.On(t) + assert := With(t) cases := []struct { input []byte @@ -21,15 +21,15 @@ func TestBytesToHex(t *testing.T) { } for _, test := range cases { - assert.String(test.output).Equals(BytesToHexString(test.input)) + assert(test.output, Equals, BytesToHexString(test.input)) } } func TestInt64(t *testing.T) { - assert := assert.On(t) + assert := With(t) x := int64(375134875348) b := Int64ToBytes(x, []byte{}) v := BytesToInt64(b) - assert.Int64(x).Equals(v) + assert(x, Equals, v) } diff --git a/common/serial/numbers_test.go b/common/serial/numbers_test.go index 9464df5b..7d67f1ed 100644 --- a/common/serial/numbers_test.go +++ b/common/serial/numbers_test.go @@ -6,15 +6,15 @@ import ( "v2ray.com/core/common" "v2ray.com/core/common/buf" . "v2ray.com/core/common/serial" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" ) func TestUint32(t *testing.T) { - assert := assert.On(t) + assert := With(t) x := uint32(458634234) s1 := Uint32ToBytes(x, []byte{}) s2 := buf.New() common.Must(s2.AppendSupplier(WriteUint32(x))) - assert.Bytes(s1).Equals(s2.Bytes()) + assert(s1, Equals, s2.Bytes()) } diff --git a/common/serial/typed_message_test.go b/common/serial/typed_message_test.go index 74da1b90..4bf7c540 100644 --- a/common/serial/typed_message_test.go +++ b/common/serial/typed_message_test.go @@ -4,13 +4,13 @@ import ( "testing" . "v2ray.com/core/common/serial" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" ) func TestGetInstance(t *testing.T) { - assert := assert.On(t) + assert := With(t) p, err := GetInstance("") - assert.Pointer(p).IsNil() - assert.Error(err).IsNotNil() + assert(p, IsNil) + assert(err, IsNotNil) } diff --git a/common/signal/exec_test.go b/common/signal/exec_test.go index e335054f..d6bac83b 100644 --- a/common/signal/exec_test.go +++ b/common/signal/exec_test.go @@ -6,11 +6,11 @@ import ( "testing" . "v2ray.com/core/common/signal" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" ) func TestErrorOrFinish2_Error(t *testing.T) { - assert := assert.On(t) + assert := With(t) c1 := make(chan error, 1) c2 := make(chan error, 2) @@ -22,11 +22,11 @@ func TestErrorOrFinish2_Error(t *testing.T) { c1 <- errors.New("test") err := <-c - assert.String(err.Error()).Equals("test") + assert(err.Error(), Equals, "test") } func TestErrorOrFinish2_Error2(t *testing.T) { - assert := assert.On(t) + assert := With(t) c1 := make(chan error, 1) c2 := make(chan error, 2) @@ -38,11 +38,11 @@ func TestErrorOrFinish2_Error2(t *testing.T) { c2 <- errors.New("test") err := <-c - assert.String(err.Error()).Equals("test") + assert(err.Error(), Equals, "test") } func TestErrorOrFinish2_NoneError(t *testing.T) { - assert := assert.On(t) + assert := With(t) c1 := make(chan error, 1) c2 := make(chan error, 2) @@ -61,11 +61,11 @@ func TestErrorOrFinish2_NoneError(t *testing.T) { close(c2) err := <-c - assert.Error(err).IsNil() + assert(err, IsNil) } func TestErrorOrFinish2_NoneError2(t *testing.T) { - assert := assert.On(t) + assert := With(t) c1 := make(chan error, 1) c2 := make(chan error, 2) @@ -84,5 +84,5 @@ func TestErrorOrFinish2_NoneError2(t *testing.T) { close(c1) err := <-c - assert.Error(err).IsNil() + assert(err, IsNil) } diff --git a/common/signal/timer_test.go b/common/signal/timer_test.go index 8c5f57e6..abaa9f6a 100644 --- a/common/signal/timer_test.go +++ b/common/signal/timer_test.go @@ -7,26 +7,26 @@ import ( "time" . "v2ray.com/core/common/signal" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" ) func TestActivityTimer(t *testing.T) { - assert := assert.On(t) + assert := With(t) ctx, timer := CancelAfterInactivity(context.Background(), time.Second*5) time.Sleep(time.Second * 6) - assert.Error(ctx.Err()).IsNotNil() + assert(ctx.Err(), IsNotNil) runtime.KeepAlive(timer) } func TestActivityTimerUpdate(t *testing.T) { - assert := assert.On(t) + assert := With(t) ctx, timer := CancelAfterInactivity(context.Background(), time.Second*10) time.Sleep(time.Second * 3) - assert.Error(ctx.Err()).IsNil() + assert(ctx.Err(), IsNil) timer.SetTimeout(time.Second * 1) time.Sleep(time.Second * 2) - assert.Error(ctx.Err()).IsNotNil() + assert(ctx.Err(), IsNotNil) runtime.KeepAlive(timer) } diff --git a/common/uuid/uuid_test.go b/common/uuid/uuid_test.go index 27d1e149..f8b90085 100644 --- a/common/uuid/uuid_test.go +++ b/common/uuid/uuid_test.go @@ -4,74 +4,74 @@ import ( "testing" . "v2ray.com/core/common/uuid" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" ) func TestParseBytes(t *testing.T) { - assert := assert.On(t) + assert := With(t) str := "2418d087-648d-4990-86e8-19dca1d006d3" bytes := []byte{0x24, 0x18, 0xd0, 0x87, 0x64, 0x8d, 0x49, 0x90, 0x86, 0xe8, 0x19, 0xdc, 0xa1, 0xd0, 0x06, 0xd3} uuid, err := ParseBytes(bytes) - assert.Error(err).IsNil() - assert.String(uuid.String()).Equals(str) + assert(err, IsNil) + assert(uuid.String(), Equals, str) _, err = ParseBytes([]byte{1, 3, 2, 4}) - assert.Error(err).IsNotNil() + assert(err, IsNotNil) } func TestParseString(t *testing.T) { - assert := assert.On(t) + assert := With(t) str := "2418d087-648d-4990-86e8-19dca1d006d3" expectedBytes := []byte{0x24, 0x18, 0xd0, 0x87, 0x64, 0x8d, 0x49, 0x90, 0x86, 0xe8, 0x19, 0xdc, 0xa1, 0xd0, 0x06, 0xd3} uuid, err := ParseString(str) - assert.Error(err).IsNil() - assert.Bytes(uuid.Bytes()).Equals(expectedBytes) + assert(err, IsNil) + assert(uuid.Bytes(), Equals, expectedBytes) uuid, err = ParseString("2418d087") - assert.Error(err).IsNotNil() + assert(err, IsNotNil) uuid, err = ParseString("2418d087-648k-4990-86e8-19dca1d006d3") - assert.Error(err).IsNotNil() + assert(err, IsNotNil) } func TestNewUUID(t *testing.T) { - assert := assert.On(t) + assert := With(t) uuid := New() uuid2, err := ParseString(uuid.String()) - assert.Error(err).IsNil() - assert.String(uuid.String()).Equals(uuid2.String()) - assert.Bytes(uuid.Bytes()).Equals(uuid2.Bytes()) + assert(err, IsNil) + assert(uuid.String(), Equals, uuid2.String()) + assert(uuid.Bytes(), Equals, uuid2.Bytes()) } func TestRandom(t *testing.T) { - assert := assert.On(t) + assert := With(t) uuid := New() uuid2 := New() - assert.String(uuid.String()).NotEquals(uuid2.String()) - assert.Bytes(uuid.Bytes()).NotEquals(uuid2.Bytes()) + assert(uuid.String(), NotEquals, uuid2.String()) + assert(uuid.Bytes(), NotEquals, uuid2.Bytes()) } func TestEquals(t *testing.T) { - assert := assert.On(t) + assert := With(t) var uuid *UUID = nil var uuid2 *UUID = nil - assert.Bool(uuid.Equals(uuid2)).IsTrue() - assert.Bool(uuid.Equals(New())).IsFalse() + assert(uuid.Equals(uuid2), IsTrue) + assert(uuid.Equals(New()), IsFalse) } func TestNext(t *testing.T) { - assert := assert.On(t) + assert := With(t) uuid := New() uuid2 := uuid.Next() - assert.Bool(uuid.Equals(uuid2)).IsFalse() + assert(uuid.Equals(uuid2), IsFalse) } diff --git a/proxy/blackhole/config_test.go b/proxy/blackhole/config_test.go index 7678d7cf..1e5ad352 100644 --- a/proxy/blackhole/config_test.go +++ b/proxy/blackhole/config_test.go @@ -7,11 +7,11 @@ import ( "v2ray.com/core/common/buf" . "v2ray.com/core/proxy/blackhole" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" ) func TestHTTPResponse(t *testing.T) { - assert := assert.On(t) + assert := With(t) buffer := buf.New() @@ -20,6 +20,6 @@ func TestHTTPResponse(t *testing.T) { reader := bufio.NewReader(buffer) response, err := http.ReadResponse(reader, nil) - assert.Error(err).IsNil() - assert.Int(response.StatusCode).Equals(403) + assert(err, IsNil) + assert(response.StatusCode, Equals, 403) } diff --git a/proxy/http/server_test.go b/proxy/http/server_test.go index 2bc370a2..f2d1dafc 100644 --- a/proxy/http/server_test.go +++ b/proxy/http/server_test.go @@ -7,13 +7,13 @@ import ( "testing" . "v2ray.com/core/proxy/http" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" _ "v2ray.com/core/transport/internet/tcp" ) func TestHopByHopHeadersStrip(t *testing.T) { - assert := assert.On(t) + assert := With(t) rawRequest := `GET /pkg/net/http/ HTTP/1.1 Host: golang.org @@ -31,17 +31,17 @@ Accept-Language: de,en;q=0.7,en-us;q=0.3 ` b := bufio.NewReader(strings.NewReader(rawRequest)) req, err := http.ReadRequest(b) - assert.Error(err).IsNil() - assert.String(req.Header.Get("Foo")).Equals("foo") - assert.String(req.Header.Get("Bar")).Equals("bar") - assert.String(req.Header.Get("Connection")).Equals("keep-alive,Foo, Bar") - assert.String(req.Header.Get("Proxy-Connection")).Equals("keep-alive") - assert.String(req.Header.Get("Proxy-Authenticate")).Equals("abc") + assert(err, IsNil) + assert(req.Header.Get("Foo"), Equals, "foo") + assert(req.Header.Get("Bar"), Equals, "bar") + assert(req.Header.Get("Connection"), Equals, "keep-alive,Foo, Bar") + assert(req.Header.Get("Proxy-Connection"), Equals, "keep-alive") + assert(req.Header.Get("Proxy-Authenticate"), Equals, "abc") StripHopByHopHeaders(req.Header) - assert.String(req.Header.Get("Connection")).IsEmpty() - assert.String(req.Header.Get("Foo")).IsEmpty() - assert.String(req.Header.Get("Bar")).IsEmpty() - assert.String(req.Header.Get("Proxy-Connection")).IsEmpty() - assert.String(req.Header.Get("Proxy-Authenticate")).IsEmpty() + assert(req.Header.Get("Connection"), IsEmpty) + assert(req.Header.Get("Foo"), IsEmpty) + assert(req.Header.Get("Bar"), IsEmpty) + assert(req.Header.Get("Proxy-Connection"), IsEmpty) + assert(req.Header.Get("Proxy-Authenticate"), IsEmpty) } diff --git a/proxy/shadowsocks/ota_test.go b/proxy/shadowsocks/ota_test.go index dda777e1..b93d55a6 100644 --- a/proxy/shadowsocks/ota_test.go +++ b/proxy/shadowsocks/ota_test.go @@ -5,11 +5,11 @@ import ( "v2ray.com/core/common/buf" . "v2ray.com/core/proxy/shadowsocks" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" ) func TestNormalChunkReading(t *testing.T) { - assert := assert.On(t) + assert := With(t) buffer := buf.New() buffer.AppendBytes( @@ -17,12 +17,12 @@ func TestNormalChunkReading(t *testing.T) { reader := NewChunkReader(buffer, NewAuthenticator(ChunkKeyGenerator( []byte{21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36}))) payload, err := reader.Read() - assert.Error(err).IsNil() - assert.Bytes(payload[0].Bytes()).Equals([]byte{11, 12, 13, 14, 15, 16, 17, 18}) + assert(err, IsNil) + assert(payload[0].Bytes(), Equals, []byte{11, 12, 13, 14, 15, 16, 17, 18}) } func TestNormalChunkWriting(t *testing.T) { - assert := assert.On(t) + assert := With(t) buffer := buf.NewLocal(512) writer := NewChunkWriter(buffer, NewAuthenticator(ChunkKeyGenerator( @@ -31,6 +31,6 @@ func TestNormalChunkWriting(t *testing.T) { b := buf.NewLocal(256) b.Append([]byte{11, 12, 13, 14, 15, 16, 17, 18}) err := writer.Write(buf.NewMultiBufferValue(b)) - assert.Error(err).IsNil() - assert.Bytes(buffer.Bytes()).Equals([]byte{0, 8, 39, 228, 69, 96, 133, 39, 254, 26, 201, 70, 11, 12, 13, 14, 15, 16, 17, 18}) + assert(err, IsNil) + assert(buffer.Bytes(), Equals, []byte{0, 8, 39, 228, 69, 96, 133, 39, 254, 26, 201, 70, 11, 12, 13, 14, 15, 16, 17, 18}) } diff --git a/proxy/shadowsocks/protocol_test.go b/proxy/shadowsocks/protocol_test.go index 5371868c..763bd26b 100644 --- a/proxy/shadowsocks/protocol_test.go +++ b/proxy/shadowsocks/protocol_test.go @@ -8,11 +8,11 @@ import ( "v2ray.com/core/common/protocol" "v2ray.com/core/common/serial" . "v2ray.com/core/proxy/shadowsocks" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" ) func TestUDPEncoding(t *testing.T) { - assert := assert.On(t) + assert := With(t) request := &protocol.RequestHeader{ Version: Version, @@ -32,17 +32,17 @@ func TestUDPEncoding(t *testing.T) { data := buf.NewLocal(256) data.AppendSupplier(serial.WriteString("test string")) encodedData, err := EncodeUDPPacket(request, data.Bytes()) - assert.Error(err).IsNil() + assert(err, IsNil) decodedRequest, decodedData, err := DecodeUDPPacket(request.User, encodedData) - assert.Error(err).IsNil() - assert.Bytes(decodedData.Bytes()).Equals(data.Bytes()) - assert.Address(decodedRequest.Address).Equals(request.Address) - assert.Port(decodedRequest.Port).Equals(request.Port) + assert(err, IsNil) + assert(decodedData.Bytes(), Equals, data.Bytes()) + assert(decodedRequest.Address, Equals, request.Address) + assert(decodedRequest.Port, Equals, request.Port) } func TestTCPRequest(t *testing.T) { - assert := assert.On(t) + assert := With(t) cases := []struct { request *protocol.RequestHeader @@ -110,18 +110,18 @@ func TestTCPRequest(t *testing.T) { defer cache.Release() writer, err := WriteTCPRequest(request, cache) - assert.Error(err).IsNil() + assert(err, IsNil) - assert.Error(writer.Write(buf.NewMultiBufferValue(data))).IsNil() + assert(writer.Write(buf.NewMultiBufferValue(data)), IsNil) decodedRequest, reader, err := ReadTCPSession(request.User, cache) - assert.Error(err).IsNil() - assert.Address(decodedRequest.Address).Equals(request.Address) - assert.Port(decodedRequest.Port).Equals(request.Port) + assert(err, IsNil) + assert(decodedRequest.Address, Equals, request.Address) + assert(decodedRequest.Port, Equals, request.Port) decodedData, err := reader.Read() - assert.Error(err).IsNil() - assert.String(decodedData[0].String()).Equals(string(payload)) + assert(err, IsNil) + assert(decodedData[0].String(), Equals, string(payload)) } for _, test := range cases { @@ -131,7 +131,7 @@ func TestTCPRequest(t *testing.T) { } func TestUDPReaderWriter(t *testing.T) { - assert := assert.On(t) + assert := With(t) user := &protocol.User{ Account: serial.ToTypedMessage(&Account{ @@ -159,18 +159,18 @@ func TestUDPReaderWriter(t *testing.T) { b := buf.New() b.AppendSupplier(serial.WriteString("test payload")) err := writer.Write(buf.NewMultiBufferValue(b)) - assert.Error(err).IsNil() + assert(err, IsNil) payload, err := reader.Read() - assert.Error(err).IsNil() - assert.String(payload[0].String()).Equals("test payload") + assert(err, IsNil) + assert(payload[0].String(), Equals, "test payload") b = buf.New() b.AppendSupplier(serial.WriteString("test payload 2")) err = writer.Write(buf.NewMultiBufferValue(b)) - assert.Error(err).IsNil() + assert(err, IsNil) payload, err = reader.Read() - assert.Error(err).IsNil() - assert.String(payload[0].String()).Equals("test payload 2") + assert(err, IsNil) + assert(payload[0].String(), Equals, "test payload 2") } diff --git a/proxy/socks/protocol_test.go b/proxy/socks/protocol_test.go index f0111abc..61f2d8db 100644 --- a/proxy/socks/protocol_test.go +++ b/proxy/socks/protocol_test.go @@ -7,11 +7,11 @@ import ( "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" . "v2ray.com/core/proxy/socks" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" ) func TestUDPEncoding(t *testing.T) { - assert := assert.On(t) + assert := With(t) b := buf.New() @@ -24,11 +24,11 @@ func TestUDPEncoding(t *testing.T) { content := []byte{'a'} payload := buf.New() payload.Append(content) - assert.Error(writer.Write(buf.NewMultiBufferValue(payload))).IsNil() + assert(writer.Write(buf.NewMultiBufferValue(payload)), IsNil) reader := NewUDPReader(b) decodedPayload, err := reader.Read() - assert.Error(err).IsNil() - assert.Bytes(decodedPayload[0].Bytes()).Equals(content) + assert(err, IsNil) + assert(decodedPayload[0].Bytes(), Equals, content) } diff --git a/proxy/vmess/encoding/auth_test.go b/proxy/vmess/encoding/auth_test.go index a160fdea..c8abb584 100644 --- a/proxy/vmess/encoding/auth_test.go +++ b/proxy/vmess/encoding/auth_test.go @@ -6,11 +6,11 @@ import ( "v2ray.com/core/common" . "v2ray.com/core/proxy/vmess/encoding" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" ) func TestFnvAuth(t *testing.T) { - assert := assert.On(t) + assert := With(t) fnvAuth := new(FnvAuthenticator) expectedText := make([]byte, 256) @@ -20,7 +20,7 @@ func TestFnvAuth(t *testing.T) { buffer := make([]byte, 512) b := fnvAuth.Seal(buffer[:0], nil, expectedText, nil) b, err = fnvAuth.Open(buffer[:0], nil, b, nil) - assert.Error(err).IsNil() - assert.Int(len(b)).Equals(256) - assert.Bytes(b).Equals(expectedText) + assert(err, IsNil) + assert(len(b), Equals, 256) + assert(b, Equals, expectedText) } diff --git a/proxy/vmess/encoding/commands_test.go b/proxy/vmess/encoding/commands_test.go index 142c73cb..f0d93bde 100644 --- a/proxy/vmess/encoding/commands_test.go +++ b/proxy/vmess/encoding/commands_test.go @@ -7,11 +7,11 @@ import ( "v2ray.com/core/common/protocol" "v2ray.com/core/common/uuid" . "v2ray.com/core/proxy/vmess/encoding" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" ) func TestSwitchAccount(t *testing.T) { - assert := assert.On(t) + assert := With(t) sa := &protocol.CommandSwitchAccount{ Port: 1234, @@ -23,18 +23,18 @@ func TestSwitchAccount(t *testing.T) { buffer := buf.New() err := MarshalCommand(sa, buffer) - assert.Error(err).IsNil() + assert(err, IsNil) cmd, err := UnmarshalCommand(1, buffer.BytesFrom(2)) - assert.Error(err).IsNil() + assert(err, IsNil) sa2, ok := cmd.(*protocol.CommandSwitchAccount) - assert.Bool(ok).IsTrue() - assert.Pointer(sa.Host).IsNil() - assert.Pointer(sa2.Host).IsNil() - assert.Port(sa.Port).Equals(sa2.Port) - assert.String(sa.ID.String()).Equals(sa2.ID.String()) - assert.Uint16(sa.AlterIds).Equals(sa2.AlterIds) - assert.Byte(byte(sa.Level)).Equals(byte(sa2.Level)) - assert.Byte(sa.ValidMin).Equals(sa2.ValidMin) + assert(ok, IsTrue) + assert(sa.Host, IsNil) + assert(sa2.Host, IsNil) + assert(sa.Port, Equals, sa2.Port) + assert(sa.ID.String(), Equals, sa2.ID.String()) + assert(sa.AlterIds, Equals, sa2.AlterIds) + assert(byte(sa.Level), Equals, byte(sa2.Level)) + assert(sa.ValidMin, Equals, sa2.ValidMin) } diff --git a/proxy/vmess/encoding/encoding_test.go b/proxy/vmess/encoding/encoding_test.go index 043e3384..6ed0edc1 100644 --- a/proxy/vmess/encoding/encoding_test.go +++ b/proxy/vmess/encoding/encoding_test.go @@ -12,11 +12,11 @@ import ( "v2ray.com/core/common/uuid" "v2ray.com/core/proxy/vmess" . "v2ray.com/core/proxy/vmess/encoding" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" ) func TestRequestSerialization(t *testing.T) { - assert := assert.On(t) + assert := With(t) user := &protocol.User{ Level: 0, @@ -52,18 +52,18 @@ func TestRequestSerialization(t *testing.T) { server := NewServerSession(userValidator, sessionHistory) actualRequest, err := server.DecodeRequestHeader(buffer) - assert.Error(err).IsNil() + assert(err, IsNil) - assert.Byte(expectedRequest.Version).Equals(actualRequest.Version) - assert.Byte(byte(expectedRequest.Command)).Equals(byte(actualRequest.Command)) - assert.Byte(byte(expectedRequest.Option)).Equals(byte(actualRequest.Option)) - assert.Address(expectedRequest.Address).Equals(actualRequest.Address) - assert.Port(expectedRequest.Port).Equals(actualRequest.Port) - assert.Byte(byte(expectedRequest.Security)).Equals(byte(actualRequest.Security)) + assert(expectedRequest.Version, Equals, actualRequest.Version) + assert(byte(expectedRequest.Command), Equals, byte(actualRequest.Command)) + assert(byte(expectedRequest.Option), Equals, byte(actualRequest.Option)) + assert(expectedRequest.Address, Equals, actualRequest.Address) + assert(expectedRequest.Port, Equals, actualRequest.Port) + assert(byte(expectedRequest.Security), Equals, byte(actualRequest.Security)) _, err = server.DecodeRequestHeader(buffer2) // anti replay attack - assert.Error(err).IsNotNil() + assert(err, IsNotNil) cancel() } diff --git a/testing/scenarios/dns_test.go b/testing/scenarios/dns_test.go index aadb6620..0360d157 100644 --- a/testing/scenarios/dns_test.go +++ b/testing/scenarios/dns_test.go @@ -14,18 +14,18 @@ import ( "v2ray.com/core/proxy/blackhole" "v2ray.com/core/proxy/freedom" "v2ray.com/core/proxy/socks" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" "v2ray.com/core/testing/servers/tcp" ) func TestResolveIP(t *testing.T) { - assert := assert.On(t) + assert := With(t) tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() - assert.Error(err).IsNil() + assert(err, IsNil) defer tcpServer.Close() serverPort := pickPort() @@ -81,24 +81,24 @@ func TestResolveIP(t *testing.T) { } servers, err := InitializeServerConfigs(serverConfig) - assert.Error(err).IsNil() + assert(err, IsNil) { noAuthDialer, err := xproxy.SOCKS5("tcp", net.TCPDestination(net.LocalHostIP, serverPort).NetAddr(), nil, xproxy.Direct) - assert.Error(err).IsNil() + assert(err, IsNil) conn, err := noAuthDialer.Dial("tcp", fmt.Sprintf("google.com:%d", dest.Port)) - assert.Error(err).IsNil() + assert(err, IsNil) payload := "test payload" nBytes, err := conn.Write([]byte(payload)) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(len(payload)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload)) response := make([]byte, 1024) nBytes, err = conn.Read(response) - assert.Error(err).IsNil() - assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload))) - assert.Error(conn.Close()).IsNil() + assert(err, IsNil) + assert(response[:nBytes], Equals, xor([]byte(payload))) + assert(conn.Close(), IsNil) } CloseAllServers(servers) diff --git a/testing/scenarios/dokodemo_test.go b/testing/scenarios/dokodemo_test.go index 0c88d0eb..9deee05b 100644 --- a/testing/scenarios/dokodemo_test.go +++ b/testing/scenarios/dokodemo_test.go @@ -15,19 +15,19 @@ import ( "v2ray.com/core/proxy/vmess" "v2ray.com/core/proxy/vmess/inbound" "v2ray.com/core/proxy/vmess/outbound" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" "v2ray.com/core/testing/servers/tcp" "v2ray.com/core/testing/servers/udp" ) func TestDokodemoTCP(t *testing.T) { - assert := assert.On(t) + assert := With(t) tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() - assert.Error(err).IsNil() + assert(err, IsNil) defer tcpServer.Close() userID := protocol.NewID(uuid.New()) @@ -109,38 +109,38 @@ func TestDokodemoTCP(t *testing.T) { } servers, err := InitializeServerConfigs(serverConfig, clientConfig) - assert.Error(err).IsNil() + assert(err, IsNil) for port := clientPort; port <= clientPort+clientPortRange; port++ { conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{ IP: []byte{127, 0, 0, 1}, Port: int(port), }) - assert.Error(err).IsNil() + assert(err, IsNil) payload := "dokodemo request." nBytes, err := conn.Write([]byte(payload)) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(len(payload)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload)) response := make([]byte, 1024) nBytes, err = conn.Read(response) - assert.Error(err).IsNil() - assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload))) - assert.Error(conn.Close()).IsNil() + assert(err, IsNil) + assert(response[:nBytes], Equals, xor([]byte(payload))) + assert(conn.Close(), IsNil) } CloseAllServers(servers) } func TestDokodemoUDP(t *testing.T) { - assert := assert.On(t) + assert := With(t) udpServer := udp.Server{ MsgProcessor: xor, } dest, err := udpServer.Start() - assert.Error(err).IsNil() + assert(err, IsNil) defer udpServer.Close() userID := protocol.NewID(uuid.New()) @@ -210,25 +210,25 @@ func TestDokodemoUDP(t *testing.T) { } servers, err := InitializeServerConfigs(serverConfig, clientConfig) - assert.Error(err).IsNil() + assert(err, IsNil) for port := clientPort; port <= clientPort+clientPortRange; port++ { conn, err := net.DialUDP("udp", nil, &net.UDPAddr{ IP: []byte{127, 0, 0, 1}, Port: int(port), }) - assert.Error(err).IsNil() + assert(err, IsNil) payload := "dokodemo request." nBytes, err := conn.Write([]byte(payload)) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(len(payload)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload)) response := make([]byte, 1024) nBytes, err = conn.Read(response) - assert.Error(err).IsNil() - assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload))) - assert.Error(conn.Close()).IsNil() + assert(err, IsNil) + assert(response[:nBytes], Equals, xor([]byte(payload))) + assert(conn.Close(), IsNil) } CloseAllServers(servers) diff --git a/testing/scenarios/feature_test.go b/testing/scenarios/feature_test.go index 282bcbe1..903fd943 100644 --- a/testing/scenarios/feature_test.go +++ b/testing/scenarios/feature_test.go @@ -24,21 +24,21 @@ import ( "v2ray.com/core/proxy/vmess" "v2ray.com/core/proxy/vmess/inbound" "v2ray.com/core/proxy/vmess/outbound" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" "v2ray.com/core/testing/servers/tcp" "v2ray.com/core/testing/servers/udp" "v2ray.com/core/transport/internet" ) func TestPassiveConnection(t *testing.T) { - assert := assert.On(t) + assert := With(t) tcpServer := tcp.Server{ MsgProcessor: xor, SendFirst: []byte("send first"), } dest, err := tcpServer.Start() - assert.Error(err).IsNil() + assert(err, IsNil) defer tcpServer.Close() serverPort := pickPort() @@ -66,49 +66,49 @@ func TestPassiveConnection(t *testing.T) { } servers, err := InitializeServerConfigs(serverConfig) - assert.Error(err).IsNil() + assert(err, IsNil) conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{ IP: []byte{127, 0, 0, 1}, Port: int(serverPort), }) - assert.Error(err).IsNil() + assert(err, IsNil) { response := make([]byte, 1024) nBytes, err := conn.Read(response) - assert.Error(err).IsNil() - assert.String(string(response[:nBytes])).Equals("send first") + assert(err, IsNil) + assert(string(response[:nBytes]), Equals, "send first") } payload := "dokodemo request." { nBytes, err := conn.Write([]byte(payload)) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(len(payload)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload)) } { response := make([]byte, 1024) nBytes, err := conn.Read(response) - assert.Error(err).IsNil() - assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload))) + assert(err, IsNil) + assert(response[:nBytes], Equals, xor([]byte(payload))) } - assert.Error(conn.Close()).IsNil() + assert(conn.Close(), IsNil) CloseAllServers(servers) } func TestProxy(t *testing.T) { - assert := assert.On(t) + assert := With(t) tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() - assert.Error(err).IsNil() + assert(err, IsNil) defer tcpServer.Close() serverUserID := protocol.NewID(uuid.New()) @@ -227,36 +227,36 @@ func TestProxy(t *testing.T) { } servers, err := InitializeServerConfigs(serverConfig, proxyConfig, clientConfig) - assert.Error(err).IsNil() + assert(err, IsNil) conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{ IP: []byte{127, 0, 0, 1}, Port: int(clientPort), }) - assert.Error(err).IsNil() + assert(err, IsNil) payload := "dokodemo request." nBytes, err := conn.Write([]byte(payload)) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(len(payload)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload)) response := make([]byte, 1024) nBytes, err = conn.Read(response) - assert.Error(err).IsNil() - assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload))) - assert.Error(conn.Close()).IsNil() + assert(err, IsNil) + assert(response[:nBytes], Equals, xor([]byte(payload))) + assert(conn.Close(), IsNil) CloseAllServers(servers) } func TestProxyOverKCP(t *testing.T) { - assert := assert.On(t) + assert := With(t) tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() - assert.Error(err).IsNil() + assert(err, IsNil) defer tcpServer.Close() serverUserID := protocol.NewID(uuid.New()) @@ -386,43 +386,43 @@ func TestProxyOverKCP(t *testing.T) { } servers, err := InitializeServerConfigs(serverConfig, proxyConfig, clientConfig) - assert.Error(err).IsNil() + assert(err, IsNil) conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{ IP: []byte{127, 0, 0, 1}, Port: int(clientPort), }) - assert.Error(err).IsNil() + assert(err, IsNil) payload := "dokodemo request." nBytes, err := conn.Write([]byte(payload)) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(len(payload)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload)) response := make([]byte, 1024) nBytes, err = conn.Read(response) - assert.Error(err).IsNil() - assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload))) - assert.Error(conn.Close()).IsNil() + assert(err, IsNil) + assert(response[:nBytes], Equals, xor([]byte(payload))) + assert(conn.Close(), IsNil) CloseAllServers(servers) } func TestBlackhole(t *testing.T) { - assert := assert.On(t) + assert := With(t) tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() - assert.Error(err).IsNil() + assert(err, IsNil) defer tcpServer.Close() tcpServer2 := tcp.Server{ MsgProcessor: xor, } dest2, err := tcpServer2.Start() - assert.Error(err).IsNil() + assert(err, IsNil) defer tcpServer2.Close() serverPort := pickPort() @@ -479,41 +479,41 @@ func TestBlackhole(t *testing.T) { } servers, err := InitializeServerConfigs(serverConfig) - assert.Error(err).IsNil() + assert(err, IsNil) conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{ IP: []byte{127, 0, 0, 1}, Port: int(serverPort2), }) - assert.Error(err).IsNil() + assert(err, IsNil) payload := "dokodemo request." { nBytes, err := conn.Write([]byte(payload)) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(len(payload)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload)) } { response := make([]byte, 1024) _, err := conn.Read(response) - assert.Error(err).IsNotNil() + assert(err, IsNotNil) } - assert.Error(conn.Close()).IsNil() + assert(conn.Close(), IsNil) CloseAllServers(servers) } func TestForward(t *testing.T) { - assert := assert.On(t) + assert := With(t) tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() - assert.Error(err).IsNil() + assert(err, IsNil) defer tcpServer.Close() serverPort := pickPort() @@ -549,37 +549,37 @@ func TestForward(t *testing.T) { } servers, err := InitializeServerConfigs(serverConfig) - assert.Error(err).IsNil() + assert(err, IsNil) { noAuthDialer, err := xproxy.SOCKS5("tcp", net.TCPDestination(net.LocalHostIP, serverPort).NetAddr(), nil, xproxy.Direct) - assert.Error(err).IsNil() + assert(err, IsNil) conn, err := noAuthDialer.Dial("tcp", "google.com:80") - assert.Error(err).IsNil() + assert(err, IsNil) payload := "test payload" nBytes, err := conn.Write([]byte(payload)) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(len(payload)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload)) response := make([]byte, 1024) nBytes, err = conn.Read(response) - assert.Error(err).IsNil() - assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload))) - assert.Error(conn.Close()).IsNil() + assert(err, IsNil) + assert(response[:nBytes], Equals, xor([]byte(payload))) + assert(conn.Close(), IsNil) } CloseAllServers(servers) } func TestUDPConnection(t *testing.T) { - assert := assert.On(t) + assert := With(t) udpServer := udp.Server{ MsgProcessor: xor, } dest, err := udpServer.Start() - assert.Error(err).IsNil() + assert(err, IsNil) defer udpServer.Close() clientPort := pickPort() @@ -607,28 +607,28 @@ func TestUDPConnection(t *testing.T) { } servers, err := InitializeServerConfigs(clientConfig) - assert.Error(err).IsNil() + assert(err, IsNil) { conn, err := net.DialUDP("udp", nil, &net.UDPAddr{ IP: []byte{127, 0, 0, 1}, Port: int(clientPort), }) - assert.Error(err).IsNil() + assert(err, IsNil) payload := "dokodemo request." for i := 0; i < 5; i++ { nBytes, err := conn.Write([]byte(payload)) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(len(payload)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload)) response := make([]byte, 1024) nBytes, err = conn.Read(response) - assert.Error(err).IsNil() - assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload))) + assert(err, IsNil) + assert(response[:nBytes], Equals, xor([]byte(payload))) } - assert.Error(conn.Close()).IsNil() + assert(conn.Close(), IsNil) } time.Sleep(20 * time.Second) @@ -638,25 +638,25 @@ func TestUDPConnection(t *testing.T) { IP: []byte{127, 0, 0, 1}, Port: int(clientPort), }) - assert.Error(err).IsNil() + assert(err, IsNil) payload := "dokodemo request." nBytes, err := conn.Write([]byte(payload)) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(len(payload)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload)) response := make([]byte, 1024) nBytes, err = conn.Read(response) - assert.Error(err).IsNil() - assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload))) - assert.Error(conn.Close()).IsNil() + assert(err, IsNil) + assert(response[:nBytes], Equals, xor([]byte(payload))) + assert(conn.Close(), IsNil) } CloseAllServers(servers) } func TestDomainSniffing(t *testing.T) { - assert := assert.On(t) + assert := With(t) sniffingPort := pickPort() httpPort := pickPort() @@ -725,7 +725,7 @@ func TestDomainSniffing(t *testing.T) { } servers, err := InitializeServerConfigs(serverConfig) - assert.Error(err).IsNil() + assert(err, IsNil) { transport := &http.Transport{ @@ -739,10 +739,10 @@ func TestDomainSniffing(t *testing.T) { } resp, err := client.Get("https://www.github.com/") - assert.Error(err).IsNil() - assert.Int(resp.StatusCode).Equals(200) + assert(err, IsNil) + assert(resp.StatusCode, Equals, 200) - assert.Error(resp.Write(ioutil.Discard)).IsNil() + assert(resp.Write(ioutil.Discard), IsNil) } CloseAllServers(servers) diff --git a/testing/scenarios/http_test.go b/testing/scenarios/http_test.go index 181cc21c..ad7ede42 100644 --- a/testing/scenarios/http_test.go +++ b/testing/scenarios/http_test.go @@ -12,12 +12,12 @@ import ( "v2ray.com/core/common/serial" "v2ray.com/core/proxy/freedom" v2http "v2ray.com/core/proxy/http" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" v2httptest "v2ray.com/core/testing/servers/http" ) func TestHttpConformance(t *testing.T) { - assert := assert.On(t) + assert := With(t) httpServerPort := pickPort() httpServer := &v2httptest.Server{ @@ -25,7 +25,7 @@ func TestHttpConformance(t *testing.T) { PathHandler: make(map[string]http.HandlerFunc), } _, err := httpServer.Start() - assert.Error(err).IsNil() + assert(err, IsNil) defer httpServer.Close() serverPort := pickPort() @@ -47,7 +47,7 @@ func TestHttpConformance(t *testing.T) { } servers, err := InitializeServerConfigs(serverConfig) - assert.Error(err).IsNil() + assert(err, IsNil) { transport := &http.Transport{ @@ -61,12 +61,12 @@ func TestHttpConformance(t *testing.T) { } resp, err := client.Get("http://127.0.0.1:" + httpServerPort.String()) - assert.Error(err).IsNil() - assert.Int(resp.StatusCode).Equals(200) + assert(err, IsNil) + assert(resp.StatusCode, Equals, 200) content, err := ioutil.ReadAll(resp.Body) - assert.Error(err).IsNil() - assert.String(string(content)).Equals("Home") + assert(err, IsNil) + assert(string(content), Equals, "Home") } diff --git a/testing/scenarios/shadowsocks_test.go b/testing/scenarios/shadowsocks_test.go index 3bfd948c..94d8a0e9 100644 --- a/testing/scenarios/shadowsocks_test.go +++ b/testing/scenarios/shadowsocks_test.go @@ -15,19 +15,19 @@ import ( "v2ray.com/core/proxy/dokodemo" "v2ray.com/core/proxy/freedom" "v2ray.com/core/proxy/shadowsocks" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" "v2ray.com/core/testing/servers/tcp" "v2ray.com/core/testing/servers/udp" ) func TestShadowsocksAES256TCP(t *testing.T) { - assert := assert.On(t) + assert := With(t) tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() - assert.Error(err).IsNil() + assert(err, IsNil) defer tcpServer.Close() account := serial.ToTypedMessage(&shadowsocks.Account{ @@ -108,7 +108,7 @@ func TestShadowsocksAES256TCP(t *testing.T) { } servers, err := InitializeServerConfigs(serverConfig, clientConfig) - assert.Error(err).IsNil() + assert(err, IsNil) var wg sync.WaitGroup wg.Add(10) @@ -118,18 +118,18 @@ func TestShadowsocksAES256TCP(t *testing.T) { IP: []byte{127, 0, 0, 1}, Port: int(clientPort), }) - assert.Error(err).IsNil() + assert(err, IsNil) payload := make([]byte, 10240*1024) rand.Read(payload) nBytes, err := conn.Write([]byte(payload)) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(len(payload)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload)) response := readFrom(conn, time.Second*20, 10240*1024) - assert.Bytes(response).Equals(xor([]byte(payload))) - assert.Error(conn.Close()).IsNil() + assert(response, Equals, xor([]byte(payload))) + assert(conn.Close(), IsNil) wg.Done() }() } @@ -139,13 +139,13 @@ func TestShadowsocksAES256TCP(t *testing.T) { } func TestShadowsocksAES128UDP(t *testing.T) { - assert := assert.On(t) + assert := With(t) udpServer := udp.Server{ MsgProcessor: xor, } dest, err := udpServer.Start() - assert.Error(err).IsNil() + assert(err, IsNil) defer udpServer.Close() account := serial.ToTypedMessage(&shadowsocks.Account{ @@ -227,7 +227,7 @@ func TestShadowsocksAES128UDP(t *testing.T) { } servers, err := InitializeServerConfigs(serverConfig, clientConfig) - assert.Error(err).IsNil() + assert(err, IsNil) var wg sync.WaitGroup wg.Add(10) @@ -237,18 +237,18 @@ func TestShadowsocksAES128UDP(t *testing.T) { IP: []byte{127, 0, 0, 1}, Port: int(clientPort), }) - assert.Error(err).IsNil() + assert(err, IsNil) payload := make([]byte, 1024) rand.Read(payload) nBytes, err := conn.Write([]byte(payload)) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(len(payload)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload)) response := readFrom(conn, time.Second*5, 1024) - assert.Bytes(response).Equals(xor([]byte(payload))) - assert.Error(conn.Close()).IsNil() + assert(response, Equals, xor([]byte(payload))) + assert(conn.Close(), IsNil) wg.Done() }() } @@ -258,13 +258,13 @@ func TestShadowsocksAES128UDP(t *testing.T) { } func TestShadowsocksChacha20TCP(t *testing.T) { - assert := assert.On(t) + assert := With(t) tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() - assert.Error(err).IsNil() + assert(err, IsNil) defer tcpServer.Close() account := serial.ToTypedMessage(&shadowsocks.Account{ @@ -345,7 +345,7 @@ func TestShadowsocksChacha20TCP(t *testing.T) { } servers, err := InitializeServerConfigs(serverConfig, clientConfig) - assert.Error(err).IsNil() + assert(err, IsNil) var wg sync.WaitGroup wg.Add(10) @@ -355,18 +355,18 @@ func TestShadowsocksChacha20TCP(t *testing.T) { IP: []byte{127, 0, 0, 1}, Port: int(clientPort), }) - assert.Error(err).IsNil() + assert(err, IsNil) payload := make([]byte, 10240*1024) rand.Read(payload) nBytes, err := conn.Write([]byte(payload)) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(len(payload)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload)) response := readFrom(conn, time.Second*20, 10240*1024) - assert.Bytes(response).Equals(xor([]byte(payload))) - assert.Error(conn.Close()).IsNil() + assert(response, Equals, xor([]byte(payload))) + assert(conn.Close(), IsNil) wg.Done() }() } diff --git a/testing/scenarios/socks_test.go b/testing/scenarios/socks_test.go index 11f3a1e4..264ab2cd 100644 --- a/testing/scenarios/socks_test.go +++ b/testing/scenarios/socks_test.go @@ -13,19 +13,19 @@ import ( "v2ray.com/core/proxy/dokodemo" "v2ray.com/core/proxy/freedom" "v2ray.com/core/proxy/socks" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" "v2ray.com/core/testing/servers/tcp" "v2ray.com/core/testing/servers/udp" ) func TestSocksBridgeTCP(t *testing.T) { - assert := assert.On(t) + assert := With(t) tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() - assert.Error(err).IsNil() + assert(err, IsNil) defer tcpServer.Close() serverPort := pickPort() @@ -93,36 +93,36 @@ func TestSocksBridgeTCP(t *testing.T) { } servers, err := InitializeServerConfigs(serverConfig, clientConfig) - assert.Error(err).IsNil() + assert(err, IsNil) conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{ IP: []byte{127, 0, 0, 1}, Port: int(clientPort), }) - assert.Error(err).IsNil() + assert(err, IsNil) payload := "test payload" nBytes, err := conn.Write([]byte(payload)) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(len(payload)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload)) response := make([]byte, 1024) nBytes, err = conn.Read(response) - assert.Error(err).IsNil() - assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload))) - assert.Error(conn.Close()).IsNil() + assert(err, IsNil) + assert(response[:nBytes], Equals, xor([]byte(payload))) + assert(conn.Close(), IsNil) CloseAllServers(servers) } func TestSocksBridageUDP(t *testing.T) { - assert := assert.On(t) + assert := With(t) udpServer := udp.Server{ MsgProcessor: xor, } dest, err := udpServer.Start() - assert.Error(err).IsNil() + assert(err, IsNil) defer udpServer.Close() serverPort := pickPort() @@ -190,36 +190,36 @@ func TestSocksBridageUDP(t *testing.T) { } servers, err := InitializeServerConfigs(serverConfig, clientConfig) - assert.Error(err).IsNil() + assert(err, IsNil) conn, err := net.DialUDP("udp", nil, &net.UDPAddr{ IP: []byte{127, 0, 0, 1}, Port: int(clientPort), }) - assert.Error(err).IsNil() + assert(err, IsNil) payload := "dokodemo request." nBytes, err := conn.Write([]byte(payload)) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(len(payload)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload)) response := make([]byte, 1024) nBytes, err = conn.Read(response) - assert.Error(err).IsNil() - assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload))) - assert.Error(conn.Close()).IsNil() + assert(err, IsNil) + assert(response[:nBytes], Equals, xor([]byte(payload))) + assert(conn.Close(), IsNil) CloseAllServers(servers) } func TestSocksConformance(t *testing.T) { - assert := assert.On(t) + assert := With(t) tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() - assert.Error(err).IsNil() + assert(err, IsNil) defer tcpServer.Close() authPort := pickPort() @@ -263,76 +263,76 @@ func TestSocksConformance(t *testing.T) { } servers, err := InitializeServerConfigs(serverConfig) - assert.Error(err).IsNil() + assert(err, IsNil) { noAuthDialer, err := xproxy.SOCKS5("tcp", net.TCPDestination(net.LocalHostIP, noAuthPort).NetAddr(), nil, xproxy.Direct) - assert.Error(err).IsNil() + assert(err, IsNil) conn, err := noAuthDialer.Dial("tcp", dest.NetAddr()) - assert.Error(err).IsNil() + assert(err, IsNil) payload := "test payload" nBytes, err := conn.Write([]byte(payload)) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(len(payload)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload)) response := make([]byte, 1024) nBytes, err = conn.Read(response) - assert.Error(err).IsNil() - assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload))) - assert.Error(conn.Close()).IsNil() + assert(err, IsNil) + assert(response[:nBytes], Equals, xor([]byte(payload))) + assert(conn.Close(), IsNil) } { authDialer, err := xproxy.SOCKS5("tcp", net.TCPDestination(net.LocalHostIP, authPort).NetAddr(), &xproxy.Auth{User: "Test Account", Password: "Test Password"}, xproxy.Direct) - assert.Error(err).IsNil() + assert(err, IsNil) conn, err := authDialer.Dial("tcp", dest.NetAddr()) - assert.Error(err).IsNil() + assert(err, IsNil) payload := "test payload" nBytes, err := conn.Write([]byte(payload)) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(len(payload)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload)) response := make([]byte, 1024) nBytes, err = conn.Read(response) - assert.Error(err).IsNil() - assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload))) - assert.Error(conn.Close()).IsNil() + assert(err, IsNil) + assert(response[:nBytes], Equals, xor([]byte(payload))) + assert(conn.Close(), IsNil) } { dialer := socks4.DialSocksProxy(socks4.SOCKS4, net.TCPDestination(net.LocalHostIP, noAuthPort).NetAddr()) conn, err := dialer("tcp", dest.NetAddr()) - assert.Error(err).IsNil() + assert(err, IsNil) payload := "test payload" nBytes, err := conn.Write([]byte(payload)) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(len(payload)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload)) response := make([]byte, 1024) nBytes, err = conn.Read(response) - assert.Error(err).IsNil() - assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload))) - assert.Error(conn.Close()).IsNil() + assert(err, IsNil) + assert(response[:nBytes], Equals, xor([]byte(payload))) + assert(conn.Close(), IsNil) } { dialer := socks4.DialSocksProxy(socks4.SOCKS4A, net.TCPDestination(net.LocalHostIP, noAuthPort).NetAddr()) conn, err := dialer("tcp", net.TCPDestination(net.LocalHostDomain, tcpServer.Port).NetAddr()) - assert.Error(err).IsNil() + assert(err, IsNil) payload := "test payload" nBytes, err := conn.Write([]byte(payload)) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(len(payload)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload)) response := make([]byte, 1024) nBytes, err = conn.Read(response) - assert.Error(err).IsNil() - assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload))) - assert.Error(conn.Close()).IsNil() + assert(err, IsNil) + assert(response[:nBytes], Equals, xor([]byte(payload))) + assert(conn.Close(), IsNil) } CloseAllServers(servers) diff --git a/testing/scenarios/tls_test.go b/testing/scenarios/tls_test.go index 8204157e..f60ba490 100644 --- a/testing/scenarios/tls_test.go +++ b/testing/scenarios/tls_test.go @@ -16,7 +16,7 @@ import ( "v2ray.com/core/proxy/vmess" "v2ray.com/core/proxy/vmess/inbound" "v2ray.com/core/proxy/vmess/outbound" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" "v2ray.com/core/testing/servers/tcp" tlsgen "v2ray.com/core/testing/tls" "v2ray.com/core/transport/internet" @@ -25,13 +25,13 @@ import ( ) func TestSimpleTLSConnection(t *testing.T) { - assert := assert.On(t) + assert := With(t) tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() - assert.Error(err).IsNil() + assert(err, IsNil) defer tcpServer.Close() userID := protocol.NewID(uuid.New()) @@ -118,34 +118,34 @@ func TestSimpleTLSConnection(t *testing.T) { } servers, err := InitializeServerConfigs(serverConfig, clientConfig) - assert.Error(err).IsNil() + assert(err, IsNil) conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{ IP: []byte{127, 0, 0, 1}, Port: int(clientPort), }) - assert.Error(err).IsNil() + assert(err, IsNil) payload := "dokodemo request." nBytes, err := conn.Write([]byte(payload)) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(len(payload)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload)) response := readFrom(conn, time.Second*2, len(payload)) - assert.Bytes(response).Equals(xor([]byte(payload))) - assert.Error(conn.Close()).IsNil() + assert(response, Equals, xor([]byte(payload))) + assert(conn.Close(), IsNil) CloseAllServers(servers) } func TestTLSOverKCP(t *testing.T) { - assert := assert.On(t) + assert := With(t) tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() - assert.Error(err).IsNil() + assert(err, IsNil) defer tcpServer.Close() userID := protocol.NewID(uuid.New()) @@ -234,34 +234,34 @@ func TestTLSOverKCP(t *testing.T) { } servers, err := InitializeServerConfigs(serverConfig, clientConfig) - assert.Error(err).IsNil() + assert(err, IsNil) conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{ IP: []byte{127, 0, 0, 1}, Port: int(clientPort), }) - assert.Error(err).IsNil() + assert(err, IsNil) payload := "dokodemo request." nBytes, err := conn.Write([]byte(payload)) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(len(payload)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload)) response := readFrom(conn, time.Second*2, len(payload)) - assert.Bytes(response).Equals(xor([]byte(payload))) - assert.Error(conn.Close()).IsNil() + assert(response, Equals, xor([]byte(payload))) + assert(conn.Close(), IsNil) CloseAllServers(servers) } func TestTLSOverWebSocket(t *testing.T) { - assert := assert.On(t) + assert := With(t) tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() - assert.Error(err).IsNil() + assert(err, IsNil) defer tcpServer.Close() userID := protocol.NewID(uuid.New()) @@ -356,23 +356,23 @@ func TestTLSOverWebSocket(t *testing.T) { } servers, err := InitializeServerConfigs(serverConfig, clientConfig) - assert.Error(err).IsNil() + assert(err, IsNil) conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{ IP: []byte{127, 0, 0, 1}, Port: int(clientPort), }) - assert.Error(err).IsNil() + assert(err, IsNil) payload := make([]byte, 10240*1024) rand.Read(payload) nBytes, err := conn.Write([]byte(payload)) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(len(payload)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload)) response := readFrom(conn, time.Second*20, len(payload)) - assert.Bytes(response).Equals(xor([]byte(payload))) - assert.Error(conn.Close()).IsNil() + assert(response, Equals, xor([]byte(payload))) + assert(conn.Close(), IsNil) CloseAllServers(servers) } diff --git a/testing/scenarios/transport_test.go b/testing/scenarios/transport_test.go index e2052e01..e5ae3269 100644 --- a/testing/scenarios/transport_test.go +++ b/testing/scenarios/transport_test.go @@ -15,7 +15,7 @@ import ( "v2ray.com/core/proxy/vmess" "v2ray.com/core/proxy/vmess/inbound" "v2ray.com/core/proxy/vmess/outbound" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" "v2ray.com/core/testing/servers/tcp" "v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet/headers/http" @@ -23,13 +23,13 @@ import ( ) func TestHttpConnectionHeader(t *testing.T) { - assert := assert.On(t) + assert := With(t) tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() - assert.Error(err).IsNil() + assert(err, IsNil) defer tcpServer.Close() userID := protocol.NewID(uuid.New()) @@ -120,22 +120,22 @@ func TestHttpConnectionHeader(t *testing.T) { } servers, err := InitializeServerConfigs(serverConfig, clientConfig) - assert.Error(err).IsNil() + assert(err, IsNil) conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{ IP: []byte{127, 0, 0, 1}, Port: int(clientPort), }) - assert.Error(err).IsNil() + assert(err, IsNil) payload := "dokodemo request." nBytes, err := conn.Write([]byte(payload)) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(len(payload)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload)) response := readFrom(conn, time.Second*2, len(payload)) - assert.Bytes(response).Equals(xor([]byte(payload))) - assert.Error(conn.Close()).IsNil() + assert(response, Equals, xor([]byte(payload))) + assert(conn.Close(), IsNil) CloseAllServers(servers) } diff --git a/testing/scenarios/vmess_test.go b/testing/scenarios/vmess_test.go index 80a53fbf..d8c5edcf 100644 --- a/testing/scenarios/vmess_test.go +++ b/testing/scenarios/vmess_test.go @@ -18,20 +18,20 @@ import ( "v2ray.com/core/proxy/vmess" "v2ray.com/core/proxy/vmess/inbound" "v2ray.com/core/proxy/vmess/outbound" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" "v2ray.com/core/testing/servers/tcp" "v2ray.com/core/testing/servers/udp" "v2ray.com/core/transport/internet" ) func TestVMessDynamicPort(t *testing.T) { - assert := assert.On(t) + assert := With(t) tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() - assert.Error(err).IsNil() + assert(err, IsNil) defer tcpServer.Close() userID := protocol.NewID(uuid.New()) @@ -135,38 +135,38 @@ func TestVMessDynamicPort(t *testing.T) { } servers, err := InitializeServerConfigs(serverConfig, clientConfig) - assert.Error(err).IsNil() + assert(err, IsNil) for i := 0; i < 10; i++ { conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{ IP: []byte{127, 0, 0, 1}, Port: int(clientPort), }) - assert.Error(err).IsNil() + assert(err, IsNil) payload := "dokodemo request." nBytes, err := conn.Write([]byte(payload)) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(len(payload)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload)) response := make([]byte, 1024) nBytes, err = conn.Read(response) - assert.Error(err).IsNil() - assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload))) - assert.Error(conn.Close()).IsNil() + assert(err, IsNil) + assert(response[:nBytes], Equals, xor([]byte(payload))) + assert(conn.Close(), IsNil) } CloseAllServers(servers) } func TestVMessGCM(t *testing.T) { - assert := assert.On(t) + assert := With(t) tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() - assert.Error(err).IsNil() + assert(err, IsNil) defer tcpServer.Close() userID := protocol.NewID(uuid.New()) @@ -252,7 +252,7 @@ func TestVMessGCM(t *testing.T) { } servers, err := InitializeServerConfigs(serverConfig, clientConfig) - assert.Error(err).IsNil() + assert(err, IsNil) var wg sync.WaitGroup wg.Add(10) @@ -262,18 +262,18 @@ func TestVMessGCM(t *testing.T) { IP: []byte{127, 0, 0, 1}, Port: int(clientPort), }) - assert.Error(err).IsNil() + assert(err, IsNil) payload := make([]byte, 10240*1024) rand.Read(payload) nBytes, err := conn.Write([]byte(payload)) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(len(payload)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload)) response := readFrom(conn, time.Second*20, 10240*1024) - assert.Bytes(response).Equals(xor([]byte(payload))) - assert.Error(conn.Close()).IsNil() + assert(response, Equals, xor([]byte(payload))) + assert(conn.Close(), IsNil) wg.Done() }() } @@ -283,13 +283,13 @@ func TestVMessGCM(t *testing.T) { } func TestVMessGCMUDP(t *testing.T) { - assert := assert.On(t) + assert := With(t) udpServer := udp.Server{ MsgProcessor: xor, } dest, err := udpServer.Start() - assert.Error(err).IsNil() + assert(err, IsNil) defer udpServer.Close() userID := protocol.NewID(uuid.New()) @@ -375,7 +375,7 @@ func TestVMessGCMUDP(t *testing.T) { } servers, err := InitializeServerConfigs(serverConfig, clientConfig) - assert.Error(err).IsNil() + assert(err, IsNil) var wg sync.WaitGroup wg.Add(10) @@ -385,28 +385,28 @@ func TestVMessGCMUDP(t *testing.T) { IP: []byte{127, 0, 0, 1}, Port: int(clientPort), }) - assert.Error(err).IsNil() + assert(err, IsNil) payload := make([]byte, 1024) rand.Read(payload) nBytes, err := conn.Write([]byte(payload)) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(len(payload)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload)) payload1 := make([]byte, 1024) rand.Read(payload1) nBytes, err = conn.Write([]byte(payload1)) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(len(payload1)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload1)) response := readFrom(conn, time.Second*5, 1024) - assert.Bytes(response).Equals(xor([]byte(payload))) + assert(response, Equals, xor([]byte(payload))) response = readFrom(conn, time.Second*5, 1024) - assert.Bytes(response).Equals(xor([]byte(payload1))) + assert(response, Equals, xor([]byte(payload1))) - assert.Error(conn.Close()).IsNil() + assert(conn.Close(), IsNil) wg.Done() }() } @@ -416,13 +416,13 @@ func TestVMessGCMUDP(t *testing.T) { } func TestVMessChacha20(t *testing.T) { - assert := assert.On(t) + assert := With(t) tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() - assert.Error(err).IsNil() + assert(err, IsNil) defer tcpServer.Close() userID := protocol.NewID(uuid.New()) @@ -508,7 +508,7 @@ func TestVMessChacha20(t *testing.T) { } servers, err := InitializeServerConfigs(serverConfig, clientConfig) - assert.Error(err).IsNil() + assert(err, IsNil) var wg sync.WaitGroup wg.Add(10) @@ -518,18 +518,18 @@ func TestVMessChacha20(t *testing.T) { IP: []byte{127, 0, 0, 1}, Port: int(clientPort), }) - assert.Error(err).IsNil() + assert(err, IsNil) payload := make([]byte, 10240*1024) rand.Read(payload) nBytes, err := conn.Write([]byte(payload)) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(len(payload)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload)) response := readFrom(conn, time.Second*20, 10240*1024) - assert.Bytes(response).Equals(xor([]byte(payload))) - assert.Error(conn.Close()).IsNil() + assert(response, Equals, xor([]byte(payload))) + assert(conn.Close(), IsNil) wg.Done() }() } @@ -539,13 +539,13 @@ func TestVMessChacha20(t *testing.T) { } func TestVMessNone(t *testing.T) { - assert := assert.On(t) + assert := With(t) tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() - assert.Error(err).IsNil() + assert(err, IsNil) defer tcpServer.Close() userID := protocol.NewID(uuid.New()) @@ -631,7 +631,7 @@ func TestVMessNone(t *testing.T) { } servers, err := InitializeServerConfigs(serverConfig, clientConfig) - assert.Error(err).IsNil() + assert(err, IsNil) var wg sync.WaitGroup wg.Add(10) @@ -641,18 +641,18 @@ func TestVMessNone(t *testing.T) { IP: []byte{127, 0, 0, 1}, Port: int(clientPort), }) - assert.Error(err).IsNil() + assert(err, IsNil) payload := make([]byte, 1024*1024) rand.Read(payload) nBytes, err := conn.Write(payload) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(len(payload)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload)) response := readFrom(conn, time.Second*20, 1024*1024) - assert.Bytes(response).Equals(xor(payload)) - assert.Error(conn.Close()).IsNil() + assert(response, Equals, xor(payload)) + assert(conn.Close(), IsNil) wg.Done() }() } @@ -662,13 +662,13 @@ func TestVMessNone(t *testing.T) { } func TestVMessKCP(t *testing.T) { - assert := assert.On(t) + assert := With(t) tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() - assert.Error(err).IsNil() + assert(err, IsNil) defer tcpServer.Close() userID := protocol.NewID(uuid.New()) @@ -762,7 +762,7 @@ func TestVMessKCP(t *testing.T) { } servers, err := InitializeServerConfigs(serverConfig, clientConfig) - assert.Error(err).IsNil() + assert(err, IsNil) var wg sync.WaitGroup for i := 0; i < 10; i++ { @@ -772,18 +772,18 @@ func TestVMessKCP(t *testing.T) { IP: []byte{127, 0, 0, 1}, Port: int(clientPort), }) - assert.Error(err).IsNil() + assert(err, IsNil) payload := make([]byte, 10240*1024) rand.Read(payload) nBytes, err := conn.Write(payload) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(len(payload)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload)) response := readFrom(conn, time.Minute, 10240*1024) - assert.Bytes(response).Equals(xor(payload)) - assert.Error(conn.Close()).IsNil() + assert(response, Equals, xor(payload)) + assert(conn.Close(), IsNil) wg.Done() }() } @@ -794,14 +794,14 @@ func TestVMessKCP(t *testing.T) { func TestVMessIPv6(t *testing.T) { t.SkipNow() // No IPv6 on travis-ci. - assert := assert.On(t) + assert := With(t) tcpServer := tcp.Server{ MsgProcessor: xor, Listen: net.LocalHostIPv6, } dest, err := tcpServer.Start() - assert.Error(err).IsNil() + assert(err, IsNil) defer tcpServer.Close() userID := protocol.NewID(uuid.New()) @@ -887,36 +887,36 @@ func TestVMessIPv6(t *testing.T) { } servers, err := InitializeServerConfigs(serverConfig, clientConfig) - assert.Error(err).IsNil() + assert(err, IsNil) conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{ IP: net.LocalHostIPv6.IP(), Port: int(clientPort), }) - assert.Error(err).IsNil() + assert(err, IsNil) payload := make([]byte, 1024) rand.Read(payload) nBytes, err := conn.Write(payload) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(len(payload)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload)) response := readFrom(conn, time.Second*20, 1024) - assert.Bytes(response).Equals(xor(payload)) - assert.Error(conn.Close()).IsNil() + assert(response, Equals, xor(payload)) + assert(conn.Close(), IsNil) CloseAllServers(servers) } func TestVMessGCMMux(t *testing.T) { - assert := assert.On(t) + assert := With(t) tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() - assert.Error(err).IsNil() + assert(err, IsNil) defer tcpServer.Close() userID := protocol.NewID(uuid.New()) @@ -1008,7 +1008,7 @@ func TestVMessGCMMux(t *testing.T) { } servers, err := InitializeServerConfigs(serverConfig, clientConfig) - assert.Error(err).IsNil() + assert(err, IsNil) for range "abcd" { var wg sync.WaitGroup @@ -1020,7 +1020,7 @@ func TestVMessGCMMux(t *testing.T) { IP: []byte{127, 0, 0, 1}, Port: int(clientPort), }) - assert.Error(err).IsNil() + assert(err, IsNil) payload := make([]byte, 10240) rand.Read(payload) @@ -1028,12 +1028,12 @@ func TestVMessGCMMux(t *testing.T) { xorpayload := xor(payload) nBytes, err := conn.Write(payload) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(len(payload)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload)) response := readFrom(conn, time.Second*20, 10240) - assert.Bytes(response).Equals(xorpayload) - assert.Error(conn.Close()).IsNil() + assert(response, Equals, xorpayload) + assert(conn.Close(), IsNil) wg.Done() }() } @@ -1045,20 +1045,20 @@ func TestVMessGCMMux(t *testing.T) { } func TestVMessGCMMuxUDP(t *testing.T) { - assert := assert.On(t) + assert := With(t) tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() - assert.Error(err).IsNil() + assert(err, IsNil) defer tcpServer.Close() udpServer := udp.Server{ MsgProcessor: xor, } udpDest, err := udpServer.Start() - assert.Error(err).IsNil() + assert(err, IsNil) defer udpServer.Close() userID := protocol.NewID(uuid.New()) @@ -1164,7 +1164,7 @@ func TestVMessGCMMuxUDP(t *testing.T) { } servers, err := InitializeServerConfigs(serverConfig, clientConfig) - assert.Error(err).IsNil() + assert(err, IsNil) for range "abcd" { var wg sync.WaitGroup @@ -1176,7 +1176,7 @@ func TestVMessGCMMuxUDP(t *testing.T) { IP: []byte{127, 0, 0, 1}, Port: int(clientPort), }) - assert.Error(err).IsNil() + assert(err, IsNil) payload := make([]byte, 10240) rand.Read(payload) @@ -1184,12 +1184,12 @@ func TestVMessGCMMuxUDP(t *testing.T) { xorpayload := xor(payload) nBytes, err := conn.Write(payload) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(len(payload)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload)) response := readFrom(conn, time.Second*20, 10240) - assert.Bytes(response).Equals(xorpayload) - assert.Error(conn.Close()).IsNil() + assert(response, Equals, xorpayload) + assert(conn.Close(), IsNil) wg.Done() }() } @@ -1199,7 +1199,7 @@ func TestVMessGCMMuxUDP(t *testing.T) { IP: []byte{127, 0, 0, 1}, Port: int(clientUDPPort), }) - assert.Error(err).IsNil() + assert(err, IsNil) conn.SetDeadline(time.Now().Add(time.Second * 10)) @@ -1210,20 +1210,20 @@ func TestVMessGCMMuxUDP(t *testing.T) { for j := 0; j < 2; j++ { nBytes, _, err := conn.WriteMsgUDP(payload, nil, nil) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(len(payload)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload)) } response := make([]byte, 1024) oob := make([]byte, 16) for j := 0; j < 2; j++ { nBytes, _, _, _, err := conn.ReadMsgUDP(response, oob) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(1024) - assert.Bytes(response).Equals(xorpayload) + assert(err, IsNil) + assert(nBytes, Equals, 1024) + assert(response, Equals, xorpayload) } - assert.Error(conn.Close()).IsNil() + assert(conn.Close(), IsNil) wg.Done() }() } diff --git a/transport/internet/dialer_test.go b/transport/internet/dialer_test.go index deabfbbd..07ce0609 100644 --- a/transport/internet/dialer_test.go +++ b/transport/internet/dialer_test.go @@ -5,21 +5,21 @@ import ( "testing" "v2ray.com/core/common/net" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" "v2ray.com/core/testing/servers/tcp" . "v2ray.com/core/transport/internet" ) func TestDialWithLocalAddr(t *testing.T) { - assert := assert.On(t) + assert := With(t) server := &tcp.Server{} dest, err := server.Start() - assert.Error(err).IsNil() + assert(err, IsNil) defer server.Close() conn, err := DialSystem(context.Background(), net.LocalHostIP, net.TCPDestination(net.LocalHostIP, dest.Port)) - assert.Error(err).IsNil() - assert.String(conn.RemoteAddr().String()).Equals("127.0.0.1:" + dest.Port.String()) + assert(err, IsNil) + assert(conn.RemoteAddr().String(), Equals, "127.0.0.1:" + dest.Port.String()) conn.Close() } diff --git a/transport/internet/header_test.go b/transport/internet/header_test.go index d4a13e4e..4cfc72ee 100644 --- a/transport/internet/header_test.go +++ b/transport/internet/header_test.go @@ -3,7 +3,7 @@ package internet_test import ( "testing" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" . "v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet/headers/noop" "v2ray.com/core/transport/internet/headers/srtp" @@ -11,17 +11,17 @@ import ( ) func TestAllHeadersLoadable(t *testing.T) { - assert := assert.On(t) + assert := With(t) noopAuth, err := CreatePacketHeader((*noop.Config)(nil)) - assert.Error(err).IsNil() - assert.Int(noopAuth.Size()).Equals(0) + assert(err, IsNil) + assert(noopAuth.Size(), Equals, 0) srtp, err := CreatePacketHeader((*srtp.Config)(nil)) - assert.Error(err).IsNil() - assert.Int(srtp.Size()).Equals(4) + assert(err, IsNil) + assert(srtp.Size(), Equals, 4) utp, err := CreatePacketHeader((*utp.Config)(nil)) - assert.Error(err).IsNil() - assert.Int(utp.Size()).Equals(4) + assert(err, IsNil) + assert(utp.Size(), Equals, 4) } diff --git a/transport/internet/headers/http/http_test.go b/transport/internet/headers/http/http_test.go index 6b805e12..37a990d2 100644 --- a/transport/internet/headers/http/http_test.go +++ b/transport/internet/headers/http/http_test.go @@ -8,31 +8,31 @@ import ( "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/common/serial" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" . "v2ray.com/core/transport/internet/headers/http" ) func TestReaderWriter(t *testing.T) { - assert := assert.On(t) + assert := With(t) cache := buf.New() b := buf.NewLocal(256) b.AppendSupplier(serial.WriteString("abcd" + ENDING)) writer := NewHeaderWriter(b) err := writer.Write(cache) - assert.Error(err).IsNil() - assert.Int(cache.Len()).Equals(8) + assert(err, IsNil) + assert(cache.Len(), Equals, 8) _, err = cache.Write([]byte{'e', 'f', 'g'}) - assert.Error(err).IsNil() + assert(err, IsNil) reader := &HeaderReader{} buffer, err := reader.Read(cache) - assert.Error(err).IsNil() - assert.Bytes(buffer.Bytes()).Equals([]byte{'e', 'f', 'g'}) + assert(err, IsNil) + assert(buffer.Bytes(), Equals, []byte{'e', 'f', 'g'}) } func TestRequestHeader(t *testing.T) { - assert := assert.On(t) + assert := With(t) auth, err := NewHttpAuthenticator(context.Background(), &Config{ Request: &RequestConfig{ @@ -45,39 +45,39 @@ func TestRequestHeader(t *testing.T) { }, }, }) - assert.Error(err).IsNil() + assert(err, IsNil) cache := buf.New() err = auth.GetClientWriter().Write(cache) - assert.Error(err).IsNil() + assert(err, IsNil) - assert.String(cache.String()).Equals("GET / HTTP/1.1\r\nTest: Value\r\n\r\n") + assert(cache.String(), Equals, "GET / HTTP/1.1\r\nTest: Value\r\n\r\n") } func TestConnection(t *testing.T) { - assert := assert.On(t) + assert := With(t) auth, err := NewHttpAuthenticator(context.Background(), new(Config)) - assert.Error(err).IsNil() + assert(err, IsNil) listener, err := net.Listen("tcp", "127.0.0.1:0") - assert.Error(err).IsNil() + assert(err, IsNil) go func() { conn, err := listener.Accept() - assert.Error(err).IsNil() + assert(err, IsNil) authConn := auth.Server(conn) b := make([]byte, 256) for { n, err := authConn.Read(b) - assert.Error(err).IsNil() + assert(err, IsNil) _, err = authConn.Write(b[:n]) - assert.Error(err).IsNil() + assert(err, IsNil) } }() conn, err := net.DialTCP("tcp", nil, listener.Addr().(*net.TCPAddr)) - assert.Error(err).IsNil() + assert(err, IsNil) authConn := auth.Client(conn) authConn.Write([]byte("Test payload")) @@ -89,12 +89,12 @@ func TestConnection(t *testing.T) { totalBytes := 0 for { n, err := authConn.Read(actualResponse[totalBytes:]) - assert.Error(err).IsNil() + assert(err, IsNil) totalBytes += n if totalBytes >= len(expectedResponse) || time.Now().After(deadline) { break } } - assert.String(string(actualResponse[:totalBytes])).Equals(expectedResponse) + assert(string(actualResponse[:totalBytes]), Equals, expectedResponse) } diff --git a/transport/internet/headers/srtp/srtp_test.go b/transport/internet/headers/srtp/srtp_test.go index f0e0be2b..4417e1c7 100644 --- a/transport/internet/headers/srtp/srtp_test.go +++ b/transport/internet/headers/srtp/srtp_test.go @@ -4,12 +4,12 @@ import ( "testing" "v2ray.com/core/common/buf" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" . "v2ray.com/core/transport/internet/headers/srtp" ) func TestSRTPWrite(t *testing.T) { - assert := assert.On(t) + assert := With(t) content := []byte{'a', 'b', 'c', 'd', 'e', 'f', 'g'} srtp := SRTP{} @@ -18,5 +18,5 @@ func TestSRTPWrite(t *testing.T) { payload.AppendSupplier(srtp.Write) payload.Append(content) - assert.Int(payload.Len()).Equals(len(content) + srtp.Size()) + assert(payload.Len(), Equals, len(content) + srtp.Size()) } diff --git a/transport/internet/headers/utp/utp_test.go b/transport/internet/headers/utp/utp_test.go index 3faa3bbc..06760db3 100644 --- a/transport/internet/headers/utp/utp_test.go +++ b/transport/internet/headers/utp/utp_test.go @@ -4,12 +4,12 @@ import ( "testing" "v2ray.com/core/common/buf" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" . "v2ray.com/core/transport/internet/headers/utp" ) func TestUTPWrite(t *testing.T) { - assert := assert.On(t) + assert := With(t) content := []byte{'a', 'b', 'c', 'd', 'e', 'f', 'g'} utp := UTP{} @@ -18,5 +18,5 @@ func TestUTPWrite(t *testing.T) { payload.AppendSupplier(utp.Write) payload.Append(content) - assert.Int(payload.Len()).Equals(len(content) + utp.Size()) + assert(payload.Len(), Equals, len(content) + utp.Size()) } diff --git a/transport/internet/headers/wechat/wechat_test.go b/transport/internet/headers/wechat/wechat_test.go index 5bdaa04f..e3e840ea 100644 --- a/transport/internet/headers/wechat/wechat_test.go +++ b/transport/internet/headers/wechat/wechat_test.go @@ -4,17 +4,17 @@ import ( "testing" "v2ray.com/core/common/buf" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" . "v2ray.com/core/transport/internet/headers/wechat" ) func TestUTPWrite(t *testing.T) { - assert := assert.On(t) + assert := With(t) video := VideoChat{} payload := buf.NewLocal(2048) payload.AppendSupplier(video.Write) - assert.Int(payload.Len()).Equals(video.Size()) + assert(payload.Len(), Equals, video.Size()) } diff --git a/transport/internet/kcp/connection_test.go b/transport/internet/kcp/connection_test.go index 231f6e32..786c320c 100644 --- a/transport/internet/kcp/connection_test.go +++ b/transport/internet/kcp/connection_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" . "v2ray.com/core/transport/internet/kcp" ) @@ -51,15 +51,15 @@ func (o *NoOpConn) SetWriteDeadline(time.Time) error { func (o *NoOpConn) Reset(input func([]Segment)) {} func TestConnectionReadTimeout(t *testing.T) { - assert := assert.On(t) + assert := With(t) conn := NewConnection(1, &NoOpConn{}, &Config{}) conn.SetReadDeadline(time.Now().Add(time.Second)) b := make([]byte, 1024) nBytes, err := conn.Read(b) - assert.Int(nBytes).Equals(0) - assert.Error(err).IsNotNil() + assert(nBytes, Equals, 0) + assert(err, IsNotNil) conn.Terminate() } diff --git a/transport/internet/kcp/crypt_test.go b/transport/internet/kcp/crypt_test.go index 47ddc7b5..52417076 100644 --- a/transport/internet/kcp/crypt_test.go +++ b/transport/internet/kcp/crypt_test.go @@ -3,12 +3,12 @@ package kcp_test import ( "testing" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" . "v2ray.com/core/transport/internet/kcp" ) func TestSimpleAuthenticator(t *testing.T) { - assert := assert.On(t) + assert := With(t) cache := make([]byte, 512) @@ -17,12 +17,12 @@ func TestSimpleAuthenticator(t *testing.T) { auth := NewSimpleAuthenticator() b := auth.Seal(cache[:0], nil, payload, nil) c, err := auth.Open(cache[:0], nil, b, nil) - assert.Error(err).IsNil() - assert.Bytes(c).Equals(payload) + assert(err, IsNil) + assert(c, Equals, payload) } func TestSimpleAuthenticator2(t *testing.T) { - assert := assert.On(t) + assert := With(t) cache := make([]byte, 512) @@ -31,6 +31,6 @@ func TestSimpleAuthenticator2(t *testing.T) { auth := NewSimpleAuthenticator() b := auth.Seal(cache[:0], nil, payload, nil) c, err := auth.Open(cache[:0], nil, b, nil) - assert.Error(err).IsNil() - assert.Bytes(c).Equals(payload) + assert(err, IsNil) + assert(c, Equals, payload) } diff --git a/transport/internet/kcp/kcp_test.go b/transport/internet/kcp/kcp_test.go index 6658d260..1d6dadd7 100644 --- a/transport/internet/kcp/kcp_test.go +++ b/transport/internet/kcp/kcp_test.go @@ -9,13 +9,13 @@ import ( "time" "v2ray.com/core/common/net" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" "v2ray.com/core/transport/internet" . "v2ray.com/core/transport/internet/kcp" ) func TestDialAndListen(t *testing.T) { - assert := assert.On(t) + assert := With(t) listerner, err := NewListener(internet.ContextWithTransportSettings(context.Background(), &Config{}), net.LocalHostIP, net.Port(0), func(ctx context.Context, conn internet.Connection) bool { go func(c internet.Connection) { @@ -34,14 +34,14 @@ func TestDialAndListen(t *testing.T) { }(conn) return true }) - assert.Error(err).IsNil() + assert(err, IsNil) port := net.Port(listerner.Addr().(*net.UDPAddr).Port) ctx := internet.ContextWithTransportSettings(context.Background(), &Config{}) wg := new(sync.WaitGroup) for i := 0; i < 10; i++ { clientConn, err := DialKCP(ctx, net.UDPDestination(net.LocalHostIP, port)) - assert.Error(err).IsNil() + assert(err, IsNil) wg.Add(1) go func() { @@ -51,14 +51,14 @@ func TestDialAndListen(t *testing.T) { clientReceived := make([]byte, 1024*1024) nBytes, _ := io.ReadFull(clientConn, clientReceived) - assert.Int(nBytes).Equals(len(clientReceived)) + assert(nBytes, Equals, len(clientReceived)) clientConn.Close() clientExpected := make([]byte, 1024*1024) for idx, b := range clientSend { clientExpected[idx] = b ^ 'c' } - assert.Bytes(clientReceived).Equals(clientExpected) + assert(clientReceived, Equals, clientExpected) wg.Done() }() @@ -68,7 +68,7 @@ func TestDialAndListen(t *testing.T) { for i := 0; i < 60 && listerner.ActiveConnections() > 0; i++ { time.Sleep(500 * time.Millisecond) } - assert.Int(listerner.ActiveConnections()).Equals(0) + assert(listerner.ActiveConnections(), Equals, 0) listerner.Close() } diff --git a/transport/internet/kcp/receiving_test.go b/transport/internet/kcp/receiving_test.go index ca12143b..21cf2c8f 100644 --- a/transport/internet/kcp/receiving_test.go +++ b/transport/internet/kcp/receiving_test.go @@ -3,12 +3,12 @@ package kcp_test import ( "testing" - "v2ray.com/core/testing/assert" . "v2ray.com/core/transport/internet/kcp" + . "v2ray.com/ext/assert" ) func TestRecivingWindow(t *testing.T) { - assert := assert.On(t) + assert := With(t) window := NewReceivingWindow(3) @@ -17,20 +17,18 @@ func TestRecivingWindow(t *testing.T) { seg2 := &DataSegment{} seg3 := &DataSegment{} - assert.Bool(window.Set(0, seg0)).IsTrue() - assert.Pointer(window.RemoveFirst()).Equals(seg0) + assert(window.Set(0, seg0), IsTrue) + assert(window.RemoveFirst(), Equals, seg0) e := window.RemoveFirst() - if e != nil { - assert.Fail("Expecting nil.") - } + assert(e, IsNil) - assert.Bool(window.Set(1, seg1)).IsTrue() - assert.Bool(window.Set(2, seg2)).IsTrue() + assert(window.Set(1, seg1), IsTrue) + assert(window.Set(2, seg2), IsTrue) window.Advance() - assert.Bool(window.Set(2, seg3)).IsTrue() + assert(window.Set(2, seg3), IsTrue) - assert.Pointer(window.RemoveFirst()).Equals(seg1) - assert.Pointer(window.Remove(1)).Equals(seg2) - assert.Pointer(window.Remove(2)).Equals(seg3) + assert(window.RemoveFirst(), Equals, seg1) + assert(window.Remove(1), Equals, seg2) + assert(window.Remove(2), Equals, seg3) } diff --git a/transport/internet/kcp/segment_test.go b/transport/internet/kcp/segment_test.go index c573c159..13247692 100644 --- a/transport/internet/kcp/segment_test.go +++ b/transport/internet/kcp/segment_test.go @@ -4,20 +4,20 @@ import ( "testing" "v2ray.com/core/common/buf" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" . "v2ray.com/core/transport/internet/kcp" ) func TestBadSegment(t *testing.T) { - assert := assert.On(t) + assert := With(t) seg, buf := ReadSegment(nil) - assert.Pointer(seg).IsNil() - assert.Int(len(buf)).Equals(0) + assert(seg, IsNil) + assert(len(buf), Equals, 0) } func TestDataSegment(t *testing.T) { - assert := assert.On(t) + assert := With(t) b := buf.NewLocal(512) b.Append([]byte{'a', 'b', 'c', 'd'}) @@ -33,19 +33,19 @@ func TestDataSegment(t *testing.T) { bytes := make([]byte, nBytes) seg.Bytes()(bytes) - assert.Int(len(bytes)).Equals(nBytes) + assert(len(bytes), Equals, nBytes) iseg, _ := ReadSegment(bytes) seg2 := iseg.(*DataSegment) - assert.Uint16(seg2.Conv).Equals(seg.Conv) - assert.Uint32(seg2.Timestamp).Equals(seg.Timestamp) - assert.Uint32(seg2.SendingNext).Equals(seg.SendingNext) - assert.Uint32(seg2.Number).Equals(seg.Number) - assert.Bytes(seg2.Data.Bytes()).Equals(seg.Data.Bytes()) + assert(seg2.Conv, Equals, seg.Conv) + assert(seg2.Timestamp, Equals, seg.Timestamp) + assert(seg2.SendingNext, Equals, seg.SendingNext) + assert(seg2.Number, Equals, seg.Number) + assert(seg2.Data.Bytes(), Equals, seg.Data.Bytes()) } func Test1ByteDataSegment(t *testing.T) { - assert := assert.On(t) + assert := With(t) b := buf.NewLocal(512) b.AppendBytes('a') @@ -61,19 +61,19 @@ func Test1ByteDataSegment(t *testing.T) { bytes := make([]byte, nBytes) seg.Bytes()(bytes) - assert.Int(len(bytes)).Equals(nBytes) + assert(len(bytes), Equals, nBytes) iseg, _ := ReadSegment(bytes) seg2 := iseg.(*DataSegment) - assert.Uint16(seg2.Conv).Equals(seg.Conv) - assert.Uint32(seg2.Timestamp).Equals(seg.Timestamp) - assert.Uint32(seg2.SendingNext).Equals(seg.SendingNext) - assert.Uint32(seg2.Number).Equals(seg.Number) - assert.Bytes(seg2.Data.Bytes()).Equals(seg.Data.Bytes()) + assert(seg2.Conv, Equals, seg.Conv) + assert(seg2.Timestamp, Equals, seg.Timestamp) + assert(seg2.SendingNext, Equals, seg.SendingNext) + assert(seg2.Number, Equals, seg.Number) + assert(seg2.Data.Bytes(), Equals, seg.Data.Bytes()) } func TestACKSegment(t *testing.T) { - assert := assert.On(t) + assert := With(t) seg := &AckSegment{ Conv: 1, @@ -87,22 +87,22 @@ func TestACKSegment(t *testing.T) { bytes := make([]byte, nBytes) seg.Bytes()(bytes) - assert.Int(len(bytes)).Equals(nBytes) + assert(len(bytes), Equals, nBytes) iseg, _ := ReadSegment(bytes) seg2 := iseg.(*AckSegment) - assert.Uint16(seg2.Conv).Equals(seg.Conv) - assert.Uint32(seg2.ReceivingWindow).Equals(seg.ReceivingWindow) - assert.Uint32(seg2.ReceivingNext).Equals(seg.ReceivingNext) - assert.Int(len(seg2.NumberList)).Equals(len(seg.NumberList)) - assert.Uint32(seg2.Timestamp).Equals(seg.Timestamp) + assert(seg2.Conv, Equals, seg.Conv) + assert(seg2.ReceivingWindow, Equals, seg.ReceivingWindow) + assert(seg2.ReceivingNext, Equals, seg.ReceivingNext) + assert(len(seg2.NumberList), Equals, len(seg.NumberList)) + assert(seg2.Timestamp, Equals, seg.Timestamp) for i, number := range seg2.NumberList { - assert.Uint32(number).Equals(seg.NumberList[i]) + assert(number, Equals, seg.NumberList[i]) } } func TestCmdSegment(t *testing.T) { - assert := assert.On(t) + assert := With(t) seg := &CmdOnlySegment{ Conv: 1, @@ -117,14 +117,14 @@ func TestCmdSegment(t *testing.T) { bytes := make([]byte, nBytes) seg.Bytes()(bytes) - assert.Int(len(bytes)).Equals(nBytes) + assert(len(bytes), Equals, nBytes) iseg, _ := ReadSegment(bytes) seg2 := iseg.(*CmdOnlySegment) - assert.Uint16(seg2.Conv).Equals(seg.Conv) - assert.Byte(byte(seg2.Command())).Equals(byte(seg.Command())) - assert.Byte(byte(seg2.Option)).Equals(byte(seg.Option)) - assert.Uint32(seg2.SendingNext).Equals(seg.SendingNext) - assert.Uint32(seg2.ReceivinNext).Equals(seg.ReceivinNext) - assert.Uint32(seg2.PeerRTO).Equals(seg.PeerRTO) + assert(seg2.Conv, Equals, seg.Conv) + assert(byte(seg2.Command()), Equals, byte(seg.Command())) + assert(byte(seg2.Option), Equals, byte(seg.Option)) + assert(seg2.SendingNext, Equals, seg.SendingNext) + assert(seg2.ReceivinNext, Equals, seg.ReceivinNext) + assert(seg2.PeerRTO, Equals, seg.PeerRTO) } diff --git a/transport/internet/kcp/sending_test.go b/transport/internet/kcp/sending_test.go index dfdb9969..d8f68998 100644 --- a/transport/internet/kcp/sending_test.go +++ b/transport/internet/kcp/sending_test.go @@ -3,40 +3,40 @@ package kcp_test import ( "testing" - "v2ray.com/core/testing/assert" . "v2ray.com/core/transport/internet/kcp" + . "v2ray.com/ext/assert" ) func TestSendingWindow(t *testing.T) { - assert := assert.On(t) + assert := With(t) window := NewSendingWindow(5, nil, nil) window.Push(0, []byte{}) window.Push(1, []byte{}) window.Push(2, []byte{}) - assert.Int(window.Len()).Equals(3) + assert(window.Len(), Equals, 3) window.Remove(1) - assert.Int(window.Len()).Equals(3) - assert.Uint32(window.FirstNumber()).Equals(0) + assert(window.Len(), Equals, 3) + assert(window.FirstNumber(), Equals, uint32(0)) window.Remove(0) - assert.Int(window.Len()).Equals(1) - assert.Uint32(window.FirstNumber()).Equals(2) + assert(window.Len(), Equals, 1) + assert(window.FirstNumber(), Equals, uint32(2)) window.Remove(0) - assert.Int(window.Len()).Equals(0) + assert(window.Len(), Equals, 0) window.Push(4, []byte{}) - assert.Int(window.Len()).Equals(1) - assert.Uint32(window.FirstNumber()).Equals(4) + assert(window.Len(), Equals, 1) + assert(window.FirstNumber(), Equals, uint32(4)) window.Push(5, []byte{}) - assert.Int(window.Len()).Equals(2) + assert(window.Len(), Equals, 2) window.Remove(1) - assert.Int(window.Len()).Equals(2) + assert(window.Len(), Equals, 2) window.Remove(0) - assert.Int(window.Len()).Equals(0) + assert(window.Len(), Equals, 0) } diff --git a/transport/internet/tcp/sockopt_linux_test.go b/transport/internet/tcp/sockopt_linux_test.go index 34e430d8..bd748824 100644 --- a/transport/internet/tcp/sockopt_linux_test.go +++ b/transport/internet/tcp/sockopt_linux_test.go @@ -7,23 +7,23 @@ import ( "strings" "testing" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" "v2ray.com/core/testing/servers/tcp" . "v2ray.com/core/transport/internet/tcp" ) func TestGetOriginalDestination(t *testing.T) { - assert := assert.On(t) + assert := With(t) tcpServer := tcp.Server{} dest, err := tcpServer.Start() - assert.Error(err).IsNil() + assert(err, IsNil) defer tcpServer.Close() conn, err := Dial(context.Background(), dest) - assert.Error(err).IsNil() + assert(err, IsNil) defer conn.Close() originalDest, err := GetOriginalDestination(conn) - assert.Bool(dest == originalDest || strings.Contains(err.Error(), "failed to call getsockopt")) + assert(dest == originalDest || strings.Contains(err.Error(), "failed to call getsockopt")) } diff --git a/transport/internet/udp/dispatcher_test.go b/transport/internet/udp/dispatcher_test.go index 5f44b53e..b780ab16 100644 --- a/transport/internet/udp/dispatcher_test.go +++ b/transport/internet/udp/dispatcher_test.go @@ -8,9 +8,9 @@ import ( "v2ray.com/core/common/buf" "v2ray.com/core/common/net" - "v2ray.com/core/testing/assert" . "v2ray.com/core/transport/internet/udp" "v2ray.com/core/transport/ray" + . "v2ray.com/ext/assert" ) type TestDispatcher struct { @@ -22,7 +22,7 @@ func (d *TestDispatcher) Dispatch(ctx context.Context, dest net.Destination) (ra } func TestSameDestinationDispatching(t *testing.T) { - assert := assert.On(t) + assert := With(t) ctx, cancel := context.WithCancel(context.Background()) link := ray.NewRay(ctx) @@ -33,7 +33,7 @@ func TestSameDestinationDispatching(t *testing.T) { break } err = link.OutboundOutput().Write(data) - assert.Error(err).IsNil() + assert(err, IsNil) } }() @@ -60,6 +60,6 @@ func TestSameDestinationDispatching(t *testing.T) { time.Sleep(time.Second) cancel() - assert.Uint32(count).Equals(1) - assert.Uint32(msgCount).Equals(6) + assert(count, Equals, uint32(1)) + assert(msgCount, Equals, uint32(6)) } diff --git a/transport/internet/websocket/ws_test.go b/transport/internet/websocket/ws_test.go index c90161c1..ac97fbf8 100644 --- a/transport/internet/websocket/ws_test.go +++ b/transport/internet/websocket/ws_test.go @@ -7,15 +7,15 @@ import ( "time" "v2ray.com/core/common/net" - "v2ray.com/core/testing/assert" tlsgen "v2ray.com/core/testing/tls" "v2ray.com/core/transport/internet" v2tls "v2ray.com/core/transport/internet/tls" . "v2ray.com/core/transport/internet/websocket" + . "v2ray.com/ext/assert" ) func Test_listenWSAndDial(t *testing.T) { - assert := assert.On(t) + assert := With(t) listen, err := ListenWS(internet.ContextWithTransportSettings(context.Background(), &Config{ Path: "ws", }), net.DomainAddress("localhost"), 13146, func(ctx context.Context, conn internet.Connection) bool { @@ -24,60 +24,58 @@ func Test_listenWSAndDial(t *testing.T) { var b [1024]byte n, err := c.Read(b[:]) - //assert.Error(err).IsNil() + //assert(err, IsNil) if err != nil { return } - assert.Bool(bytes.HasPrefix(b[:n], []byte("Test connection"))).IsTrue() + assert(bytes.HasPrefix(b[:n], []byte("Test connection")), IsTrue) _, err = c.Write([]byte("Response")) - assert.Error(err).IsNil() + assert(err, IsNil) }(conn) return true }) - assert.Error(err).IsNil() + assert(err, IsNil) ctx := internet.ContextWithTransportSettings(context.Background(), &Config{Path: "ws"}) conn, err := Dial(ctx, net.TCPDestination(net.DomainAddress("localhost"), 13146)) - assert.Error(err).IsNil() + assert(err, IsNil) _, err = conn.Write([]byte("Test connection 1")) - assert.Error(err).IsNil() + assert(err, IsNil) var b [1024]byte n, err := conn.Read(b[:]) - assert.Error(err).IsNil() - assert.String(string(b[:n])).Equals("Response") + assert(err, IsNil) + assert(string(b[:n]), Equals, "Response") - assert.Error(conn.Close()).IsNil() + assert(conn.Close(), IsNil) <-time.After(time.Second * 5) conn, err = Dial(ctx, net.TCPDestination(net.DomainAddress("localhost"), 13146)) - assert.Error(err).IsNil() + assert(err, IsNil) _, err = conn.Write([]byte("Test connection 2")) - assert.Error(err).IsNil() + assert(err, IsNil) n, err = conn.Read(b[:]) - assert.Error(err).IsNil() - assert.String(string(b[:n])).Equals("Response") - assert.Error(conn.Close()).IsNil() + assert(err, IsNil) + assert(string(b[:n]), Equals, "Response") + assert(conn.Close(), IsNil) <-time.After(time.Second * 15) conn, err = Dial(ctx, net.TCPDestination(net.DomainAddress("localhost"), 13146)) - assert.Error(err).IsNil() + assert(err, IsNil) _, err = conn.Write([]byte("Test connection 3")) - assert.Error(err).IsNil() + assert(err, IsNil) n, err = conn.Read(b[:]) - assert.Error(err).IsNil() - assert.String(string(b[:n])).Equals("Response") - assert.Error(conn.Close()).IsNil() + assert(err, IsNil) + assert(string(b[:n]), Equals, "Response") + assert(conn.Close(), IsNil) - assert.Error(listen.Close()).IsNil() + assert(listen.Close(), IsNil) } func Test_listenWSAndDial_TLS(t *testing.T) { - assert := assert.On(t) - go func() { - <-time.After(time.Second * 5) - assert.Fail("Too slow") - }() + assert := With(t) + + start := time.Now() ctx := internet.ContextWithTransportSettings(context.Background(), &Config{ Path: "wss", @@ -92,10 +90,13 @@ func Test_listenWSAndDial_TLS(t *testing.T) { }() return true }) - assert.Error(err).IsNil() + assert(err, IsNil) defer listen.Close() conn, err := Dial(ctx, net.TCPDestination(net.DomainAddress("localhost"), 13143)) - assert.Error(err).IsNil() + assert(err, IsNil) _ = conn.Close() + + end := time.Now() + assert(end.Before(start.Add(time.Second*5)), IsTrue) } diff --git a/transport/ray/direct_test.go b/transport/ray/direct_test.go index 20d0d443..6a16296c 100644 --- a/transport/ray/direct_test.go +++ b/transport/ray/direct_test.go @@ -6,44 +6,44 @@ import ( "testing" "v2ray.com/core/common/buf" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" . "v2ray.com/core/transport/ray" ) func TestStreamIO(t *testing.T) { - assert := assert.On(t) + assert := With(t) stream := NewStream(context.Background()) b1 := buf.New() b1.AppendBytes('a') - assert.Error(stream.Write(buf.NewMultiBufferValue(b1))).IsNil() + assert(stream.Write(buf.NewMultiBufferValue(b1)), IsNil) _, err := stream.Read() - assert.Error(err).IsNil() + assert(err, IsNil) stream.Close() _, err = stream.Read() - assert.Error(err).Equals(io.EOF) + assert(err, Equals, io.EOF) b2 := buf.New() b2.AppendBytes('b') err = stream.Write(buf.NewMultiBufferValue(b2)) - assert.Error(err).Equals(io.ErrClosedPipe) + assert(err, Equals, io.ErrClosedPipe) } func TestStreamClose(t *testing.T) { - assert := assert.On(t) + assert := With(t) stream := NewStream(context.Background()) b1 := buf.New() b1.AppendBytes('a') - assert.Error(stream.Write(buf.NewMultiBufferValue(b1))).IsNil() + assert(stream.Write(buf.NewMultiBufferValue(b1)), IsNil) stream.Close() _, err := stream.Read() - assert.Error(err).IsNil() + assert(err, IsNil) _, err = stream.Read() - assert.Error(err).Equals(io.EOF) + assert(err, Equals, io.EOF) } diff --git a/v2ray_test.go b/v2ray_test.go index a78bd6d5..4374340c 100644 --- a/v2ray_test.go +++ b/v2ray_test.go @@ -14,11 +14,11 @@ import ( "v2ray.com/core/proxy/dokodemo" "v2ray.com/core/proxy/vmess" "v2ray.com/core/proxy/vmess/outbound" - "v2ray.com/core/testing/assert" + . "v2ray.com/ext/assert" ) func TestV2RayClose(t *testing.T) { - assert := assert.On(t) + assert := With(t) port := net.Port(dice.RollUint16()) config := &Config{ @@ -59,7 +59,7 @@ func TestV2RayClose(t *testing.T) { } server, err := New(config) - assert.Error(err).IsNil() + assert(err, IsNil) server.Close() } From 522ac2a2e9a790a9b806ec4946e0237093b12d3d Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Tue, 24 Oct 2017 17:17:10 +0200 Subject: [PATCH 039/229] remove old assertion lib --- testing/assert/address.go | 80 ----------------------------------- testing/assert/assert.go | 69 ------------------------------ testing/assert/bool.go | 42 ------------------ testing/assert/byte.go | 38 ----------------- testing/assert/bytes.go | 43 ------------------- testing/assert/destination.go | 64 ---------------------------- testing/assert/error.go | 38 ----------------- testing/assert/int64.go | 44 ------------------- testing/assert/intsubject.go | 38 ----------------- testing/assert/ip.go | 33 --------------- testing/assert/pointer.go | 56 ------------------------ testing/assert/port.go | 44 ------------------- testing/assert/string.go | 50 ---------------------- testing/assert/subject.go | 22 ---------- testing/assert/uint16.go | 50 ---------------------- testing/assert/uint32.go | 50 ---------------------- 16 files changed, 761 deletions(-) delete mode 100644 testing/assert/address.go delete mode 100644 testing/assert/assert.go delete mode 100644 testing/assert/bool.go delete mode 100644 testing/assert/byte.go delete mode 100644 testing/assert/bytes.go delete mode 100644 testing/assert/destination.go delete mode 100644 testing/assert/error.go delete mode 100644 testing/assert/int64.go delete mode 100644 testing/assert/intsubject.go delete mode 100644 testing/assert/ip.go delete mode 100644 testing/assert/pointer.go delete mode 100644 testing/assert/port.go delete mode 100644 testing/assert/string.go delete mode 100644 testing/assert/subject.go delete mode 100644 testing/assert/uint16.go delete mode 100644 testing/assert/uint32.go diff --git a/testing/assert/address.go b/testing/assert/address.go deleted file mode 100644 index f104851e..00000000 --- a/testing/assert/address.go +++ /dev/null @@ -1,80 +0,0 @@ -package assert - -import ( - "v2ray.com/core/common/net" -) - -func (v *Assert) Address(value net.Address) *AddressSubject { - return &AddressSubject{ - Subject: Subject{ - disp: value.String(), - a: v, - }, - value: value, - } -} - -type AddressSubject struct { - Subject - value net.Address -} - -func (subject *AddressSubject) NotEquals(another net.Address) { - if subject.value == another { - subject.Fail("not equals to", another.String()) - } -} - -func (subject *AddressSubject) Equals(another net.Address) { - if subject.value != another { - subject.Fail("equals to", another.String()) - } -} - -func (subject *AddressSubject) NotEqualsString(another string) { - if subject.value.String() == another { - subject.Fail("not equals to string", another) - } -} - -func (subject *AddressSubject) EqualsString(another string) { - if subject.value.String() != another { - subject.Fail("equals to string", another) - } -} - -func (subject *AddressSubject) IsIPv4() { - if !subject.value.Family().IsIPv4() { - subject.Fail("is", "an IPv4 address") - } -} - -func (subject *AddressSubject) IsNotIPv4() { - if subject.value.Family().IsIPv4() { - subject.Fail("is not", "an IPv4 address") - } -} - -func (subject *AddressSubject) IsIPv6() { - if !subject.value.Family().IsIPv6() { - subject.Fail("is", "an IPv6 address") - } -} - -func (subject *AddressSubject) IsNotIPv6() { - if subject.value.Family().IsIPv6() { - subject.Fail("is not", "an IPv6 address") - } -} - -func (subject *AddressSubject) IsDomain() { - if !subject.value.Family().IsDomain() { - subject.Fail("is", "a domain address") - } -} - -func (subject *AddressSubject) IsNotDomain() { - if subject.value.Family().IsDomain() { - subject.Fail("is not", "a domain address") - } -} diff --git a/testing/assert/assert.go b/testing/assert/assert.go deleted file mode 100644 index fd9a9ec5..00000000 --- a/testing/assert/assert.go +++ /dev/null @@ -1,69 +0,0 @@ -package assert - -import ( - "bytes" - "fmt" - "runtime" - "strings" - "testing" -) - -func On(t *testing.T) *Assert { - return &Assert{ - t: t, - } -} - -type Assert struct { - t *testing.T -} - -func (v *Assert) Fail(message string) { - v.t.Fatal(decorate(message)) -} - -func getCaller() (string, int) { - stackLevel := 3 - for { - _, file, line, ok := runtime.Caller(stackLevel) - if strings.Contains(file, "assert") { - stackLevel++ - } else { - if ok { - // Truncate file name at last file name separator. - if index := strings.LastIndex(file, "/"); index >= 0 { - file = file[index+1:] - } else if index = strings.LastIndex(file, "\\"); index >= 0 { - file = file[index+1:] - } - } else { - file = "???" - line = 1 - } - return file, line - } - } -} - -// decorate prefixes the string with the file and line of the call site -// and inserts the final newline if needed and indentation tabs for formatting. -func decorate(s string) string { - file, line := getCaller() - buf := new(bytes.Buffer) - // Every line is indented at least one tab. - buf.WriteString(" ") - fmt.Fprintf(buf, "%s:%d: ", file, line) - lines := strings.Split(s, "\n") - if l := len(lines); l > 1 && lines[l-1] == "" { - lines = lines[:l-1] - } - for i, line := range lines { - if i > 0 { - // Second and subsequent lines are indented an extra tab. - buf.WriteString("\n\t\t") - } - buf.WriteString(line) - } - buf.WriteByte('\n') - return buf.String() -} diff --git a/testing/assert/bool.go b/testing/assert/bool.go deleted file mode 100644 index bd777a7c..00000000 --- a/testing/assert/bool.go +++ /dev/null @@ -1,42 +0,0 @@ -package assert - -import ( - "strconv" -) - -// Assert on a boolean variable. -func (v *Assert) Bool(value bool) *BoolSubject { - return &BoolSubject{ - Subject: Subject{ - disp: strconv.FormatBool(value), - a: v, - }, - value: value, - } -} - -type BoolSubject struct { - Subject - value bool -} - -// to be equal to another boolean variable. -func (subject *BoolSubject) Equals(expectation bool) { - if subject.value != expectation { - subject.Fail("is equal to", strconv.FormatBool(expectation)) - } -} - -// to be true. -func (subject *BoolSubject) IsTrue() { - if subject.value != true { - subject.Fail("is", "True") - } -} - -// to be false. -func (subject *BoolSubject) IsFalse() { - if subject.value != false { - subject.Fail("is", "False") - } -} diff --git a/testing/assert/byte.go b/testing/assert/byte.go deleted file mode 100644 index 73813cb6..00000000 --- a/testing/assert/byte.go +++ /dev/null @@ -1,38 +0,0 @@ -package assert - -import ( - "v2ray.com/core/common/serial" -) - -func (v *Assert) Byte(value byte) *ByteSubject { - return &ByteSubject{ - Subject: Subject{ - disp: serial.ByteToHexString(value), - a: v, - }, - value: value, - } -} - -type ByteSubject struct { - Subject - value byte -} - -func (subject *ByteSubject) Equals(expectation byte) { - if subject.value != expectation { - subject.Fail("is equal to", serial.ByteToHexString(expectation)) - } -} - -func (subject *ByteSubject) GreaterThan(expectation byte) { - if subject.value <= expectation { - subject.Fail("is greater than", serial.ByteToHexString(expectation)) - } -} - -func (subject *ByteSubject) LessThan(expectation byte) { - if subject.value >= expectation { - subject.Fail("is less than", serial.ByteToHexString(expectation)) - } -} diff --git a/testing/assert/bytes.go b/testing/assert/bytes.go deleted file mode 100644 index 6559735f..00000000 --- a/testing/assert/bytes.go +++ /dev/null @@ -1,43 +0,0 @@ -package assert - -import ( - "bytes" - - "fmt" - - "v2ray.com/core/common/serial" -) - -func (v *Assert) Bytes(value []byte) *BytesSubject { - return &BytesSubject{ - Subject: Subject{ - disp: serial.BytesToHexString(value), - a: v, - }, - value: value, - } -} - -type BytesSubject struct { - Subject - value []byte -} - -func (subject *BytesSubject) Equals(expectation []byte) { - if len(subject.value) != len(expectation) { - subject.FailWithMessage(fmt.Sprint("Bytes arrays have differen size: expected ", len(expectation), ", actual ", len(subject.value))) - return - } - for idx, b := range expectation { - if subject.value[idx] != b { - subject.FailWithMessage(fmt.Sprint("Bytes are different: ", b, " vs ", subject.value[idx], " at pos ", idx)) - return - } - } -} - -func (subject *BytesSubject) NotEquals(expectation []byte) { - if bytes.Equal(subject.value, expectation) { - subject.Fail("is not equal to", serial.BytesToHexString(expectation)) - } -} diff --git a/testing/assert/destination.go b/testing/assert/destination.go deleted file mode 100644 index a4b2e39e..00000000 --- a/testing/assert/destination.go +++ /dev/null @@ -1,64 +0,0 @@ -package assert - -import ( - "v2ray.com/core/common/net" -) - -func (v *Assert) Destination(value net.Destination) *DestinationSubject { - return &DestinationSubject{ - Subject: Subject{ - disp: value.String(), - a: v, - }, - value: value, - } -} - -type DestinationSubject struct { - Subject - value net.Destination -} - -func (v *DestinationSubject) IsTCP() { - if v.value.Network != net.Network_TCP { - v.Fail("is", "a TCP destination") - } -} - -func (v *DestinationSubject) IsNotTCP() { - if v.value.Network == net.Network_TCP { - v.Fail("is not", "a TCP destination") - } -} - -func (v *DestinationSubject) IsUDP() { - if v.value.Network != net.Network_UDP { - v.Fail("is", "a UDP destination") - } -} - -func (v *DestinationSubject) IsNotUDP() { - if v.value.Network == net.Network_UDP { - v.Fail("is not", "a UDP destination") - } -} - -func (v *DestinationSubject) EqualsString(another string) { - if v.value.String() != another { - v.Fail("not equals to string", another) - } -} - -func (v *DestinationSubject) Equals(another net.Destination) { - if v.value != another { - v.Fail("not equals to", another.String()) - } -} - -func (v *DestinationSubject) HasAddress() *AddressSubject { - return v.a.Address(v.value.Address) -} - -func (v *DestinationSubject) HasPort() *PortSubject { - return v.a.Port(v.value.Port) -} diff --git a/testing/assert/error.go b/testing/assert/error.go deleted file mode 100644 index 3356db0e..00000000 --- a/testing/assert/error.go +++ /dev/null @@ -1,38 +0,0 @@ -package assert - -func (v *Assert) Error(value error) *ErrorSubject { - valueStr := "" - if value != nil { - valueStr = value.Error() - } - return &ErrorSubject{ - Subject: Subject{ - a: v, - disp: valueStr, - }, - value: value, - } -} - -type ErrorSubject struct { - Subject - value error -} - -func (subject *ErrorSubject) Equals(expectation error) { - if subject.value != expectation { - subject.Fail("is equal to", expectation.Error()) - } -} - -func (subject *ErrorSubject) IsNil() { - if subject.value != nil { - subject.Fail("is", "nil") - } -} - -func (subject *ErrorSubject) IsNotNil() { - if subject.value == nil { - subject.Fail("is not", "nil") - } -} diff --git a/testing/assert/int64.go b/testing/assert/int64.go deleted file mode 100644 index cf10ea6c..00000000 --- a/testing/assert/int64.go +++ /dev/null @@ -1,44 +0,0 @@ -package assert - -import ( - "v2ray.com/core/common/serial" -) - -func (v *Assert) Int64(value int64) *Int64Subject { - return &Int64Subject{ - Subject: Subject{ - a: v, - disp: serial.Int64ToString(value), - }, - value: value, - } -} - -type Int64Subject struct { - Subject - value int64 -} - -func (subject *Int64Subject) Equals(expectation int64) { - if subject.value != expectation { - subject.Fail("is equal to", serial.Int64ToString(expectation)) - } -} - -func (subject *Int64Subject) GreaterThan(expectation int64) { - if subject.value <= expectation { - subject.Fail("is greater than", serial.Int64ToString(expectation)) - } -} - -func (subject *Int64Subject) AtMost(expectation int64) { - if subject.value > expectation { - subject.Fail("is at most", serial.Int64ToString(expectation)) - } -} - -func (subject *Int64Subject) AtLeast(expectation int64) { - if subject.value < expectation { - subject.Fail("is at least", serial.Int64ToString(expectation)) - } -} diff --git a/testing/assert/intsubject.go b/testing/assert/intsubject.go deleted file mode 100644 index b688ff60..00000000 --- a/testing/assert/intsubject.go +++ /dev/null @@ -1,38 +0,0 @@ -package assert - -import ( - "v2ray.com/core/common/serial" -) - -func (v *Assert) Int(value int) *IntSubject { - return &IntSubject{ - Subject: Subject{ - a: v, - disp: serial.IntToString(value), - }, - value: value, - } -} - -type IntSubject struct { - Subject - value int -} - -func (subject *IntSubject) Equals(expectation int) { - if subject.value != expectation { - subject.Fail("is equal to", serial.IntToString(expectation)) - } -} - -func (subject *IntSubject) GreaterThan(expectation int) { - if subject.value <= expectation { - subject.Fail("is greater than", serial.IntToString(expectation)) - } -} - -func (subject *IntSubject) LessThan(expectation int) { - if subject.value >= expectation { - subject.Fail("is less than", serial.IntToString(expectation)) - } -} diff --git a/testing/assert/ip.go b/testing/assert/ip.go deleted file mode 100644 index cf398271..00000000 --- a/testing/assert/ip.go +++ /dev/null @@ -1,33 +0,0 @@ -package assert - -import ( - "bytes" - "net" -) - -func (v *Assert) IP(value net.IP) *IPSubject { - return &IPSubject{ - Subject: Subject{ - a: v, - disp: value.String(), - }, - value: value, - } -} - -type IPSubject struct { - Subject - value net.IP -} - -func (subject *IPSubject) IsNil() { - if subject.value != nil { - subject.Fail("is", "nil") - } -} - -func (subject *IPSubject) Equals(ip net.IP) { - if !bytes.Equal([]byte(subject.value), []byte(ip)) { - subject.Fail("equals to", ip.String()) - } -} diff --git a/testing/assert/pointer.go b/testing/assert/pointer.go deleted file mode 100644 index 9bf8ef99..00000000 --- a/testing/assert/pointer.go +++ /dev/null @@ -1,56 +0,0 @@ -package assert - -import ( - "reflect" - - "v2ray.com/core/common/serial" -) - -func (v *Assert) Pointer(value interface{}) *PointerSubject { - return &PointerSubject{ - Subject: Subject{ - a: v, - disp: serial.ToString(value), - }, - value: value, - } -} - -type PointerSubject struct { - Subject - value interface{} -} - -func (subject *PointerSubject) Equals(expectation interface{}) { - if subject.value != expectation { - subject.Fail("is equal to", serial.ToString(expectation)) - } -} - -func (subject *PointerSubject) IsNil() { - if subject.value == nil { - return - } - - valueType := reflect.TypeOf(subject.value) - nilType := reflect.Zero(valueType) - realValue := reflect.ValueOf(subject.value) - - if nilType != realValue { - subject.Fail("is", "nil") - } -} - -func (subject *PointerSubject) IsNotNil() { - if subject.value == nil { - subject.Fail("is not", "nil") - } - - valueType := reflect.TypeOf(subject.value) - nilType := reflect.Zero(valueType) - realValue := reflect.ValueOf(subject.value) - - if nilType == realValue { - subject.Fail("is not", "nil") - } -} diff --git a/testing/assert/port.go b/testing/assert/port.go deleted file mode 100644 index f53fa4e9..00000000 --- a/testing/assert/port.go +++ /dev/null @@ -1,44 +0,0 @@ -package assert - -import ( - "v2ray.com/core/common/net" -) - -func (v *Assert) Port(value net.Port) *PortSubject { - return &PortSubject{ - Subject: Subject{ - a: v, - disp: value.String(), - }, - value: value, - } -} - -type PortSubject struct { - Subject - value net.Port -} - -func (subject *PortSubject) Equals(expectation net.Port) { - if subject.value.Value() != expectation.Value() { - subject.Fail("is equal to", expectation.String()) - } -} - -func (subject *PortSubject) GreaterThan(expectation net.Port) { - if subject.value.Value() <= expectation.Value() { - subject.Fail("is greater than", expectation.String()) - } -} - -func (subject *PortSubject) LessThan(expectation net.Port) { - if subject.value.Value() >= expectation.Value() { - subject.Fail("is less than", expectation.String()) - } -} - -func (subject *PortSubject) IsValid() { - if subject.value == 0 { - subject.Fail("is", "a valid port") - } -} diff --git a/testing/assert/string.go b/testing/assert/string.go deleted file mode 100644 index 30a6726d..00000000 --- a/testing/assert/string.go +++ /dev/null @@ -1,50 +0,0 @@ -package assert - -import ( - "strings" -) - -func (v *Assert) String(value string) *StringSubject { - return &StringSubject{ - Subject: Subject{ - a: v, - disp: value, - }, - value: value, - } -} - -type StringSubject struct { - Subject - value string -} - -func (subject *StringSubject) Equals(expectation string) { - if subject.value != expectation { - subject.Fail("is equal to", expectation) - } -} - -func (subject *StringSubject) NotEquals(expectation string) { - if subject.value == expectation { - subject.Fail("is not equal to ", expectation) - } -} - -func (subject *StringSubject) Contains(substring string) { - if !strings.Contains(subject.value, substring) { - subject.Fail("contains", substring) - } -} - -func (subject *StringSubject) NotContains(substring string) { - if strings.Contains(subject.value, substring) { - subject.Fail("doesn't contain", substring) - } -} - -func (subject *StringSubject) IsEmpty() { - if len(subject.value) > 0 { - subject.FailWithMessage("is not empty.") - } -} diff --git a/testing/assert/subject.go b/testing/assert/subject.go deleted file mode 100644 index b54e403c..00000000 --- a/testing/assert/subject.go +++ /dev/null @@ -1,22 +0,0 @@ -package assert - -type Subject struct { - disp string - a *Assert -} - -func (subject *Subject) Fail(verb string, other string) { - subject.FailWithMessage("Not true that " + subject.DisplayString() + " " + verb + " <" + other + ">.") -} - -func (subject *Subject) FailWithMessage(message string) { - subject.a.Fail(message) -} - -func (subject *Subject) DisplayString() string { - value := subject.disp - if len(value) == 0 { - value = "unknown" - } - return "<" + value + ">" -} diff --git a/testing/assert/uint16.go b/testing/assert/uint16.go deleted file mode 100644 index 9244e11b..00000000 --- a/testing/assert/uint16.go +++ /dev/null @@ -1,50 +0,0 @@ -package assert - -import ( - "v2ray.com/core/common/serial" -) - -func (v *Assert) Uint16(value uint16) *Uint16Subject { - return &Uint16Subject{ - Subject: Subject{ - a: v, - disp: serial.Uint16ToString(value), - }, - value: value, - } -} - -type Uint16Subject struct { - Subject - value uint16 -} - -func (subject *Uint16Subject) Equals(expectation uint16) { - if subject.value != expectation { - subject.Fail("is equal to", serial.Uint16ToString(expectation)) - } -} - -func (subject *Uint16Subject) GreaterThan(expectation uint16) { - if subject.value <= expectation { - subject.Fail("is greater than", serial.Uint16ToString(expectation)) - } -} - -func (subject *Uint16Subject) LessThan(expectation uint16) { - if subject.value >= expectation { - subject.Fail("is less than", serial.Uint16ToString(expectation)) - } -} - -func (subject *Uint16Subject) IsPositive() { - if subject.value <= 0 { - subject.Fail("is", "positive") - } -} - -func (subject *Uint16Subject) IsNegative() { - if subject.value >= 0 { - subject.Fail("is not", "negative") - } -} diff --git a/testing/assert/uint32.go b/testing/assert/uint32.go deleted file mode 100644 index b2f18c0b..00000000 --- a/testing/assert/uint32.go +++ /dev/null @@ -1,50 +0,0 @@ -package assert - -import ( - "v2ray.com/core/common/serial" -) - -func (v *Assert) Uint32(value uint32) *Uint32Subject { - return &Uint32Subject{ - Subject: Subject{ - a: v, - disp: serial.Uint32ToString(value), - }, - value: value, - } -} - -type Uint32Subject struct { - Subject - value uint32 -} - -func (subject *Uint32Subject) Equals(expectation uint32) { - if subject.value != expectation { - subject.Fail("is equal to", serial.Uint32ToString(expectation)) - } -} - -func (subject *Uint32Subject) GreaterThan(expectation uint32) { - if subject.value <= expectation { - subject.Fail("is greater than", serial.Uint32ToString(expectation)) - } -} - -func (subject *Uint32Subject) LessThan(expectation uint32) { - if subject.value >= expectation { - subject.Fail("is less than", serial.Uint32ToString(expectation)) - } -} - -func (subject *Uint32Subject) IsPositive() { - if subject.value <= 0 { - subject.Fail("is", "positive") - } -} - -func (subject *Uint32Subject) IsNegative() { - if subject.value >= 0 { - subject.Fail("is not", "negative") - } -} From 0f27e0b4d3e4c1789cd38f75871b28d57dcb3269 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Tue, 24 Oct 2017 17:33:28 +0200 Subject: [PATCH 040/229] close outbound ray on error --- app/proxyman/outbound/handler.go | 1 + 1 file changed, 1 insertion(+) diff --git a/app/proxyman/outbound/handler.go b/app/proxyman/outbound/handler.go index d9d7d86b..8c6d4bbd 100644 --- a/app/proxyman/outbound/handler.go +++ b/app/proxyman/outbound/handler.go @@ -78,6 +78,7 @@ func (h *Handler) Dispatch(ctx context.Context, outboundRay ray.OutboundRay) { err := h.mux.Dispatch(ctx, outboundRay) if err != nil { log.Trace(newError("failed to process outbound traffic").Base(err)) + outboundRay.OutboundOutput().CloseError() } } else { err := h.proxy.Process(ctx, outboundRay, h) From d6e9162f7894e8ceb1531e78c88cb9d673e5d3e4 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Tue, 24 Oct 2017 17:33:46 +0200 Subject: [PATCH 041/229] trace outstanding error only --- app/proxyman/mux/mux.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/proxyman/mux/mux.go b/app/proxyman/mux/mux.go index 171aa318..ab173220 100644 --- a/app/proxyman/mux/mux.go +++ b/app/proxyman/mux/mux.go @@ -94,7 +94,12 @@ func NewClient(p proxy.Outbound, dialer proxy.Dialer, m *ClientManager) (*Client go func() { if err := p.Process(ctx, pipe, dialer); err != nil { cancel() - log.Trace(errors.New("failed to handler mux client connection").Base(err).AtWarning()) + + traceErr := errors.New("failed to handler mux client connection").Base(err) + if err != io.EOF && err != context.Canceled { + traceErr = traceErr.AtWarning() + } + log.Trace(traceErr) } }() @@ -111,6 +116,7 @@ func NewClient(p proxy.Outbound, dialer proxy.Dialer, m *ClientManager) (*Client return c, nil } +// Closed returns true if this Client is closed. func (m *Client) Closed() bool { select { case <-m.ctx.Done(): From e4fd29db708b647113edb4549472bcd09129af0b Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Tue, 24 Oct 2017 17:36:42 +0200 Subject: [PATCH 042/229] fix test break --- transport/internet/tcp/sockopt_linux_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/transport/internet/tcp/sockopt_linux_test.go b/transport/internet/tcp/sockopt_linux_test.go index bd748824..23e4906a 100644 --- a/transport/internet/tcp/sockopt_linux_test.go +++ b/transport/internet/tcp/sockopt_linux_test.go @@ -7,9 +7,9 @@ import ( "strings" "testing" - . "v2ray.com/ext/assert" "v2ray.com/core/testing/servers/tcp" . "v2ray.com/core/transport/internet/tcp" + . "v2ray.com/ext/assert" ) func TestGetOriginalDestination(t *testing.T) { @@ -25,5 +25,5 @@ func TestGetOriginalDestination(t *testing.T) { defer conn.Close() originalDest, err := GetOriginalDestination(conn) - assert(dest == originalDest || strings.Contains(err.Error(), "failed to call getsockopt")) + assert(dest == originalDest || strings.Contains(err.Error(), "failed to call getsockopt"), IsTrue) } From 3f54bf3f539d92b9abff8f32251242542dd683b4 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Tue, 24 Oct 2017 20:23:55 +0200 Subject: [PATCH 043/229] remove unused definitions --- transport/internet/connection.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/transport/internet/connection.go b/transport/internet/connection.go index b526f746..2405ce1b 100644 --- a/transport/internet/connection.go +++ b/transport/internet/connection.go @@ -4,12 +4,6 @@ import ( "net" ) -type ConnectionHandler func(Connection) - type Connection interface { net.Conn } - -type SysFd interface { - SysFd() (int, error) -} From 36ce56c52439027c34a4edb09145000b35f92bb6 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Tue, 24 Oct 2017 20:25:45 +0200 Subject: [PATCH 044/229] refactor --- transport/internet/config.go | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/transport/internet/config.go b/transport/internet/config.go index 55a11e08..72d20f8e 100644 --- a/transport/internet/config.go +++ b/transport/internet/config.go @@ -23,22 +23,22 @@ func CreateTransportConfig(protocol TransportProtocol) (interface{}, error) { return creator(), nil } -func (v *TransportConfig) GetTypedSettings() (interface{}, error) { - return v.Settings.GetInstance() +func (c *TransportConfig) GetTypedSettings() (interface{}, error) { + return c.Settings.GetInstance() } -func (v *StreamConfig) GetEffectiveProtocol() TransportProtocol { - if v == nil { +func (c *StreamConfig) GetEffectiveProtocol() TransportProtocol { + if c == nil { return TransportProtocol_TCP } - return v.Protocol + return c.Protocol } -func (v *StreamConfig) GetEffectiveTransportSettings() (interface{}, error) { - protocol := v.GetEffectiveProtocol() +func (c *StreamConfig) GetEffectiveTransportSettings() (interface{}, error) { + protocol := c.GetEffectiveProtocol() - if v != nil { - for _, settings := range v.TransportSettings { + if c != nil { + for _, settings := range c.TransportSettings { if settings.Protocol == protocol { return settings.GetTypedSettings() } @@ -71,17 +71,17 @@ func (c *StreamConfig) GetTransportSettingsFor(protocol TransportProtocol) (inte return CreateTransportConfig(protocol) } -func (v *StreamConfig) GetEffectiveSecuritySettings() (interface{}, error) { - for _, settings := range v.SecuritySettings { - if settings.Type == v.SecurityType { +func (c *StreamConfig) GetEffectiveSecuritySettings() (interface{}, error) { + for _, settings := range c.SecuritySettings { + if settings.Type == c.SecurityType { return settings.GetInstance() } } - return serial.GetInstance(v.SecurityType) + return serial.GetInstance(c.SecurityType) } -func (v *StreamConfig) HasSecuritySettings() bool { - return len(v.SecurityType) > 0 +func (c *StreamConfig) HasSecuritySettings() bool { + return len(c.SecurityType) > 0 } func ApplyGlobalTransportSettings(settings []*TransportConfig) error { @@ -89,6 +89,6 @@ func ApplyGlobalTransportSettings(settings []*TransportConfig) error { return nil } -func (v *ProxyConfig) HasTag() bool { - return v != nil && len(v.Tag) > 0 +func (c *ProxyConfig) HasTag() bool { + return c != nil && len(c.Tag) > 0 } From da9d751e73175567768bdc4f1987b91768bd5931 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Tue, 24 Oct 2017 23:09:03 +0200 Subject: [PATCH 045/229] Update version --- core.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core.go b/core.go index 8191e0a0..d06bfae5 100644 --- a/core.go +++ b/core.go @@ -18,7 +18,7 @@ import ( ) var ( - version = "2.44" + version = "2.43" build = "Custom" codename = "One for all" intro = "An unified platform for anti-censorship." From db0bb472b0c821f6940e47c070dfd15a0680f563 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Tue, 24 Oct 2017 23:22:26 +0200 Subject: [PATCH 046/229] Update version --- core.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core.go b/core.go index d06bfae5..8191e0a0 100644 --- a/core.go +++ b/core.go @@ -18,7 +18,7 @@ import ( ) var ( - version = "2.43" + version = "2.44" build = "Custom" codename = "One for all" intro = "An unified platform for anti-censorship." From 85c0a5bbbe78608cd6e36c4d0436615c82c2127d Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Wed, 25 Oct 2017 00:23:22 +0200 Subject: [PATCH 047/229] release encrypted zip files --- tools/release/release-ci.sh | 52 +++++++++++++++++++++++++------------ 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/tools/release/release-ci.sh b/tools/release/release-ci.sh index bf3e71ad..56659500 100755 --- a/tools/release/release-ci.sh +++ b/tools/release/release-ci.sh @@ -3,7 +3,7 @@ set -x apt-get update -apt-get -y install jq git file +apt-get -y install jq git file p7zip-full function getattr() { curl -s -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/$2/attributes/$1 @@ -45,23 +45,26 @@ export TRAVIS_TAG=${RELEASE_TAG} export GPG_SIGN_PASS=${SIGN_KEY_PASS} export V_USER=${VUSER} -$GOPATH/bin/vbuild --os=windows --arch=x86 --zip --sign -$GOPATH/bin/vbuild --os=windows --arch=x64 --zip --sign -$GOPATH/bin/vbuild --os=macos --arch=x64 --zip --sign -$GOPATH/bin/vbuild --os=linux --arch=x86 --zip --sign -$GOPATH/bin/vbuild --os=linux --arch=x64 --zip --sign -$GOPATH/bin/vbuild --os=linux --arch=arm --zip --sign -$GOPATH/bin/vbuild --os=linux --arch=arm64 --zip --sign -$GOPATH/bin/vbuild --os=linux --arch=mips64 --zip --sign -$GOPATH/bin/vbuild --os=linux --arch=mips64le --zip --sign -$GOPATH/bin/vbuild --os=linux --arch=mips --zip --sign -$GOPATH/bin/vbuild --os=linux --arch=mipsle --zip --sign -$GOPATH/bin/vbuild --os=freebsd --arch=x86 --zip --sign -$GOPATH/bin/vbuild --os=freebsd --arch=amd64 --zip --sign -$GOPATH/bin/vbuild --os=openbsd --arch=x86 --zip --sign -$GOPATH/bin/vbuild --os=openbsd --arch=amd64 --zip --sign +$GOPATH/bin/vbuild --os=windows --arch=x86 --zip --sign --encrypt +$GOPATH/bin/vbuild --os=windows --arch=x64 --zip --sign --encrypt +$GOPATH/bin/vbuild --os=macos --arch=x64 --zip --sign --encrypt +$GOPATH/bin/vbuild --os=linux --arch=x86 --zip --sign --encrypt +$GOPATH/bin/vbuild --os=linux --arch=x64 --zip --sign --encrypt +$GOPATH/bin/vbuild --os=linux --arch=arm --zip --sign --encrypt +$GOPATH/bin/vbuild --os=linux --arch=arm64 --zip --sign --encrypt +$GOPATH/bin/vbuild --os=linux --arch=mips64 --zip --sign --encrypt +$GOPATH/bin/vbuild --os=linux --arch=mips64le --zip --sign --encrypt +$GOPATH/bin/vbuild --os=linux --arch=mips --zip --sign --encrypt +$GOPATH/bin/vbuild --os=linux --arch=mipsle --zip --sign --encrypt +$GOPATH/bin/vbuild --os=freebsd --arch=x86 --zip --sign --encrypt +$GOPATH/bin/vbuild --os=freebsd --arch=amd64 --zip --sign --encrypt +$GOPATH/bin/vbuild --os=openbsd --arch=x86 --zip --sign --encrypt +$GOPATH/bin/vbuild --os=openbsd --arch=amd64 --zip --sign --encrypt -JSON_DATA=$(printf '{"tag_name": "%s", "prerelease": %s}' ${RELEASE_TAG} ${PRERELEASE}) +RELBODY=$(cat $GOPATH/bin/metadata.txt | jq -R -s -c .) +JSON_DATA=$(echo "{}" | jq -c ".tag_name=\"${RELEASE_TAG}\"") +JSON_DATA=$(echo ${JSON_DATA} | jq -c ".prerelease=${PRERELEASE}") +JSON_DATA=$(echo ${JSON_DATA} | jq -c ".body=${RELBODY}") RELEASE_ID=$(curl --data "${JSON_DATA}" -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/v2ray/v2ray-core/releases | jq ".id") function upload() { @@ -86,6 +89,21 @@ upload $GOPATH/bin/v2ray-freebsd-32.zip upload $GOPATH/bin/v2ray-openbsd-64.zip upload $GOPATH/bin/v2ray-openbsd-32.zip upload $GOPATH/bin/metadata.txt +upload $GOPATH/bin/vencrypted-macos.7z +upload $GOPATH/bin/vencrypted-windows-64.7z +upload $GOPATH/bin/vencrypted-windows-32.7z +upload $GOPATH/bin/vencrypted-linux-64.7z +upload $GOPATH/bin/vencrypted-linux-32.7z +upload $GOPATH/bin/vencrypted-linux-arm.7z +upload $GOPATH/bin/vencrypted-linux-arm64.7z +upload $GOPATH/bin/vencrypted-linux-mips64.7z +upload $GOPATH/bin/vencrypted-linux-mips64le.7z +upload $GOPATH/bin/vencrypted-linux-mips.7z +upload $GOPATH/bin/vencrypted-linux-mipsle.7z +upload $GOPATH/bin/vencrypted-freebsd-64.7z +upload $GOPATH/bin/vencrypted-freebsd-32.7z +upload $GOPATH/bin/vencrypted-openbsd-64.7z +upload $GOPATH/bin/vencrypted-openbsd-32.7z if [[ "${PRERELEASE}" == "false" ]]; then From 09b955bead0b6d9c1f6c615927044b7703c9acff Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Wed, 25 Oct 2017 17:26:42 +0200 Subject: [PATCH 048/229] disable encrypted zip files --- tools/release/release-ci.sh | 67 +++++++++++++++++++------------------ 1 file changed, 34 insertions(+), 33 deletions(-) diff --git a/tools/release/release-ci.sh b/tools/release/release-ci.sh index 56659500..3708d6e4 100755 --- a/tools/release/release-ci.sh +++ b/tools/release/release-ci.sh @@ -3,7 +3,8 @@ set -x apt-get update -apt-get -y install jq git file p7zip-full +apt-get -y install jq git file +#apt-get p7zip-full function getattr() { curl -s -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/$2/attributes/$1 @@ -45,26 +46,26 @@ export TRAVIS_TAG=${RELEASE_TAG} export GPG_SIGN_PASS=${SIGN_KEY_PASS} export V_USER=${VUSER} -$GOPATH/bin/vbuild --os=windows --arch=x86 --zip --sign --encrypt -$GOPATH/bin/vbuild --os=windows --arch=x64 --zip --sign --encrypt -$GOPATH/bin/vbuild --os=macos --arch=x64 --zip --sign --encrypt -$GOPATH/bin/vbuild --os=linux --arch=x86 --zip --sign --encrypt -$GOPATH/bin/vbuild --os=linux --arch=x64 --zip --sign --encrypt -$GOPATH/bin/vbuild --os=linux --arch=arm --zip --sign --encrypt -$GOPATH/bin/vbuild --os=linux --arch=arm64 --zip --sign --encrypt -$GOPATH/bin/vbuild --os=linux --arch=mips64 --zip --sign --encrypt -$GOPATH/bin/vbuild --os=linux --arch=mips64le --zip --sign --encrypt -$GOPATH/bin/vbuild --os=linux --arch=mips --zip --sign --encrypt -$GOPATH/bin/vbuild --os=linux --arch=mipsle --zip --sign --encrypt -$GOPATH/bin/vbuild --os=freebsd --arch=x86 --zip --sign --encrypt -$GOPATH/bin/vbuild --os=freebsd --arch=amd64 --zip --sign --encrypt -$GOPATH/bin/vbuild --os=openbsd --arch=x86 --zip --sign --encrypt -$GOPATH/bin/vbuild --os=openbsd --arch=amd64 --zip --sign --encrypt +$GOPATH/bin/vbuild --os=windows --arch=x86 --zip --sign #--encrypt +$GOPATH/bin/vbuild --os=windows --arch=x64 --zip --sign #--encrypt +$GOPATH/bin/vbuild --os=macos --arch=x64 --zip --sign #--encrypt +$GOPATH/bin/vbuild --os=linux --arch=x86 --zip --sign #--encrypt +$GOPATH/bin/vbuild --os=linux --arch=x64 --zip --sign #--encrypt +$GOPATH/bin/vbuild --os=linux --arch=arm --zip --sign #--encrypt +$GOPATH/bin/vbuild --os=linux --arch=arm64 --zip --sign #--encrypt +$GOPATH/bin/vbuild --os=linux --arch=mips64 --zip --sign #--encrypt +$GOPATH/bin/vbuild --os=linux --arch=mips64le --zip --sign #--encrypt +$GOPATH/bin/vbuild --os=linux --arch=mips --zip --sign #--encrypt +$GOPATH/bin/vbuild --os=linux --arch=mipsle --zip --sign #--encrypt +$GOPATH/bin/vbuild --os=freebsd --arch=x86 --zip --sign #--encrypt +$GOPATH/bin/vbuild --os=freebsd --arch=amd64 --zip --sign #--encrypt +$GOPATH/bin/vbuild --os=openbsd --arch=x86 --zip --sign #--encrypt +$GOPATH/bin/vbuild --os=openbsd --arch=amd64 --zip --sign #--encrypt -RELBODY=$(cat $GOPATH/bin/metadata.txt | jq -R -s -c .) +#RELBODY=$(cat $GOPATH/bin/metadata.txt | jq -R -s -c .) JSON_DATA=$(echo "{}" | jq -c ".tag_name=\"${RELEASE_TAG}\"") JSON_DATA=$(echo ${JSON_DATA} | jq -c ".prerelease=${PRERELEASE}") -JSON_DATA=$(echo ${JSON_DATA} | jq -c ".body=${RELBODY}") +#JSON_DATA=$(echo ${JSON_DATA} | jq -c ".body=${RELBODY}") RELEASE_ID=$(curl --data "${JSON_DATA}" -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/v2ray/v2ray-core/releases | jq ".id") function upload() { @@ -89,21 +90,21 @@ upload $GOPATH/bin/v2ray-freebsd-32.zip upload $GOPATH/bin/v2ray-openbsd-64.zip upload $GOPATH/bin/v2ray-openbsd-32.zip upload $GOPATH/bin/metadata.txt -upload $GOPATH/bin/vencrypted-macos.7z -upload $GOPATH/bin/vencrypted-windows-64.7z -upload $GOPATH/bin/vencrypted-windows-32.7z -upload $GOPATH/bin/vencrypted-linux-64.7z -upload $GOPATH/bin/vencrypted-linux-32.7z -upload $GOPATH/bin/vencrypted-linux-arm.7z -upload $GOPATH/bin/vencrypted-linux-arm64.7z -upload $GOPATH/bin/vencrypted-linux-mips64.7z -upload $GOPATH/bin/vencrypted-linux-mips64le.7z -upload $GOPATH/bin/vencrypted-linux-mips.7z -upload $GOPATH/bin/vencrypted-linux-mipsle.7z -upload $GOPATH/bin/vencrypted-freebsd-64.7z -upload $GOPATH/bin/vencrypted-freebsd-32.7z -upload $GOPATH/bin/vencrypted-openbsd-64.7z -upload $GOPATH/bin/vencrypted-openbsd-32.7z +#upload $GOPATH/bin/vencrypted-macos.7z +#upload $GOPATH/bin/vencrypted-windows-64.7z +#upload $GOPATH/bin/vencrypted-windows-32.7z +#upload $GOPATH/bin/vencrypted-linux-64.7z +#upload $GOPATH/bin/vencrypted-linux-32.7z +#upload $GOPATH/bin/vencrypted-linux-arm.7z +#upload $GOPATH/bin/vencrypted-linux-arm64.7z +#upload $GOPATH/bin/vencrypted-linux-mips64.7z +#upload $GOPATH/bin/vencrypted-linux-mips64le.7z +#upload $GOPATH/bin/vencrypted-linux-mips.7z +#upload $GOPATH/bin/vencrypted-linux-mipsle.7z +#upload $GOPATH/bin/vencrypted-freebsd-64.7z +#upload $GOPATH/bin/vencrypted-freebsd-32.7z +#upload $GOPATH/bin/vencrypted-openbsd-64.7z +#upload $GOPATH/bin/vencrypted-openbsd-32.7z if [[ "${PRERELEASE}" == "false" ]]; then From af88016320585a0c865123fb9763a81de005f6f5 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Thu, 26 Oct 2017 11:43:02 +0200 Subject: [PATCH 049/229] fix #643 --- transport/internet/kcp/dialer.go | 4 ++-- transport/internet/tcp/dialer.go | 4 ++-- transport/internet/tls/config.go | 24 +++++++++++++++--------- transport/internet/websocket/dialer.go | 4 ++-- 4 files changed, 21 insertions(+), 15 deletions(-) diff --git a/transport/internet/kcp/dialer.go b/transport/internet/kcp/dialer.go index 1c63e5cc..197586f1 100644 --- a/transport/internet/kcp/dialer.go +++ b/transport/internet/kcp/dialer.go @@ -135,10 +135,10 @@ func DialKCP(ctx context.Context, dest net.Destination) (internet.Connection, er if securitySettings := internet.SecuritySettingsFromContext(ctx); securitySettings != nil { switch securitySettings := securitySettings.(type) { case *v2tls.Config: - config := securitySettings.GetTLSConfig() if dest.Address.Family().IsDomain() { - config.ServerName = dest.Address.Domain() + securitySettings.OverrideServerNameIfEmpty(dest.Address.Domain()) } + config := securitySettings.GetTLSConfig() tlsConn := tls.Client(iConn, config) iConn = tlsConn } diff --git a/transport/internet/tcp/dialer.go b/transport/internet/tcp/dialer.go index 17beeb90..37921d9d 100644 --- a/transport/internet/tcp/dialer.go +++ b/transport/internet/tcp/dialer.go @@ -29,10 +29,10 @@ func Dial(ctx context.Context, dest net.Destination) (internet.Connection, error if securitySettings := internet.SecuritySettingsFromContext(ctx); securitySettings != nil { tlsConfig, ok := securitySettings.(*tls.Config) if ok { - config := tlsConfig.GetTLSConfig() if dest.Address.Family().IsDomain() { - config.ServerName = dest.Address.Domain() + tlsConfig.OverrideServerNameIfEmpty(dest.Address.Domain()) } + config := tlsConfig.GetTLSConfig() conn = tls.Client(conn, config) } } diff --git a/transport/internet/tls/config.go b/transport/internet/tls/config.go index 468e6273..919a91a3 100644 --- a/transport/internet/tls/config.go +++ b/transport/internet/tls/config.go @@ -10,9 +10,9 @@ var ( globalSessionCache = tls.NewLRUClientSessionCache(128) ) -func (v *Config) BuildCertificates() []tls.Certificate { - certs := make([]tls.Certificate, 0, len(v.Certificate)) - for _, entry := range v.Certificate { +func (c *Config) BuildCertificates() []tls.Certificate { + certs := make([]tls.Certificate, 0, len(c.Certificate)) + for _, entry := range c.Certificate { keyPair, err := tls.X509KeyPair(entry.Certificate, entry.Key) if err != nil { log.Trace(newError("ignoring invalid X509 key pair").Base(err).AtWarning()) @@ -23,21 +23,27 @@ func (v *Config) BuildCertificates() []tls.Certificate { return certs } -func (v *Config) GetTLSConfig() *tls.Config { +func (c *Config) GetTLSConfig() *tls.Config { config := &tls.Config{ ClientSessionCache: globalSessionCache, NextProtos: []string{"http/1.1"}, } - if v == nil { + if c == nil { return config } - config.InsecureSkipVerify = v.AllowInsecure - config.Certificates = v.BuildCertificates() + config.InsecureSkipVerify = c.AllowInsecure + config.Certificates = c.BuildCertificates() config.BuildNameToCertificate() - if len(v.ServerName) > 0 { - config.ServerName = v.ServerName + if len(c.ServerName) > 0 { + config.ServerName = c.ServerName } return config } + +func (c *Config) OverrideServerNameIfEmpty(serverName string) { + if len(c.ServerName) == 0 { + c.ServerName = serverName + } +} diff --git a/transport/internet/websocket/dialer.go b/transport/internet/websocket/dialer.go index c42c4c9a..3386af82 100644 --- a/transport/internet/websocket/dialer.go +++ b/transport/internet/websocket/dialer.go @@ -46,10 +46,10 @@ func dialWebsocket(ctx context.Context, dest net.Destination) (net.Conn, error) tlsConfig, ok := securitySettings.(*tls.Config) if ok { protocol = "wss" - dialer.TLSClientConfig = tlsConfig.GetTLSConfig() if dest.Address.Family().IsDomain() { - dialer.TLSClientConfig.ServerName = dest.Address.Domain() + tlsConfig.OverrideServerNameIfEmpty(dest.Address.Domain()) } + dialer.TLSClientConfig = tlsConfig.GetTLSConfig() } } From 0385ccbd8c2678148f8fe73a2ed3b1ac111bf631 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Thu, 26 Oct 2017 13:00:45 +0200 Subject: [PATCH 050/229] install 7z for compression --- tools/release/release-ci.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tools/release/release-ci.sh b/tools/release/release-ci.sh index 3708d6e4..cd4d46e9 100755 --- a/tools/release/release-ci.sh +++ b/tools/release/release-ci.sh @@ -3,8 +3,7 @@ set -x apt-get update -apt-get -y install jq git file -#apt-get p7zip-full +apt-get -y install jq git file p7zip-full function getattr() { curl -s -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/$2/attributes/$1 From 12a0d6e0b9d4898aef15a38b8497fc30d51b7301 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Thu, 26 Oct 2017 21:07:33 +0200 Subject: [PATCH 051/229] cleanup --- proxy/dokodemo/dokodemo.go | 5 +---- transport/internet/udp/sourceForgeSender_bad.go | 12 ------------ transport/internet/udp/source_forging.go | 11 +++++++++++ ...{sourceForgeSender.go => source_forging_linux.go} | 12 ++++++------ 4 files changed, 18 insertions(+), 22 deletions(-) delete mode 100644 transport/internet/udp/sourceForgeSender_bad.go create mode 100644 transport/internet/udp/source_forging.go rename transport/internet/udp/{sourceForgeSender.go => source_forging_linux.go} (69%) diff --git a/proxy/dokodemo/dokodemo.go b/proxy/dokodemo/dokodemo.go index 4ae5047a..0c4136d3 100644 --- a/proxy/dokodemo/dokodemo.go +++ b/proxy/dokodemo/dokodemo.go @@ -7,8 +7,6 @@ import ( "runtime" "time" - gonet "net" - "v2ray.com/core/app" "v2ray.com/core/app/dispatcher" "v2ray.com/core/app/log" @@ -95,14 +93,13 @@ func (d *DokodemoDoor) Process(ctx context.Context, network net.Network, conn in if !d.config.FollowRedirect { writer = buf.NewSequentialWriter(conn) } else { - srca := gonet.UDPAddr{IP: dest.Address.IP(), Port: int(dest.Port.Value())} + srca := net.UDPAddr{IP: dest.Address.IP(), Port: int(dest.Port.Value())} origsend, err := udp.TransmitSocket(&srca, conn.RemoteAddr()) if err != nil { return err } writer = buf.NewSequentialWriter(origsend) } - } if err := buf.Copy(inboundRay.InboundOutput(), writer, buf.UpdateActivity(timer)); err != nil { diff --git a/transport/internet/udp/sourceForgeSender_bad.go b/transport/internet/udp/sourceForgeSender_bad.go deleted file mode 100644 index dadd4023..00000000 --- a/transport/internet/udp/sourceForgeSender_bad.go +++ /dev/null @@ -1,12 +0,0 @@ -// +build !linux - -package udp - -import ( - "errors" - "net" -) - -func TransmitionSocket(src net.Addr, dst net.Addr) (net.Conn, error) { - return nil, errors.New("Using an Linux only functionality on an non-Linux OS.") -} diff --git a/transport/internet/udp/source_forging.go b/transport/internet/udp/source_forging.go new file mode 100644 index 00000000..caa93534 --- /dev/null +++ b/transport/internet/udp/source_forging.go @@ -0,0 +1,11 @@ +// +build !linux + +package udp + +import ( + "net" +) + +func TransmitSocket(src net.Addr, dst net.Addr) (net.Conn, error) { + return nil, newError("forging source address is not supported on non-Linux platform.").AtWarning() +} diff --git a/transport/internet/udp/sourceForgeSender.go b/transport/internet/udp/source_forging_linux.go similarity index 69% rename from transport/internet/udp/sourceForgeSender.go rename to transport/internet/udp/source_forging_linux.go index 31d03a9e..238519b3 100644 --- a/transport/internet/udp/sourceForgeSender.go +++ b/transport/internet/udp/source_forging_linux.go @@ -14,16 +14,16 @@ func TransmitSocket(src net.Addr, dst net.Addr) (net.Conn, error) { var err error fd, err = syscall.Socket(syscall.AF_INET, syscall.SOCK_DGRAM, 0) if err != nil { - return nil, err + return nil, newError("failed to create fd").Base(err).AtWarning() } err = syscall.SetsockoptInt(fd, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1) if err != nil { - return nil, err + return nil, newError("failed to set resuse_addr").Base(err).AtWarning() } err = syscall.SetsockoptInt(fd, syscall.SOL_IP, syscall.IP_TRANSPARENT, 1) if err != nil { - return nil, err + return nil, newError("failed to set transparent").Base(err).AtWarning() } ip := src.(*net.UDPAddr).IP.To4() @@ -34,7 +34,7 @@ func TransmitSocket(src net.Addr, dst net.Addr) (net.Conn, error) { srcaddr.Port = src.(*net.UDPAddr).Port err = syscall.Bind(fd, &srcaddr) if err != nil { - return nil, err + return nil, newError("failed to bind source address").Base(err).AtWarning() } ipd := dst.(*net.UDPAddr).IP.To4() var ip2d [4]byte @@ -44,12 +44,12 @@ func TransmitSocket(src net.Addr, dst net.Addr) (net.Conn, error) { dstaddr.Port = dst.(*net.UDPAddr).Port err = syscall.Connect(fd, &dstaddr) if err != nil { - return nil, err + return nil, newError("failed to connect to source address").Base(err).AtWarning() } fdf := os.NewFile(uintptr(fd), "/dev/udp/") c, err := net.FileConn(fdf) if err != nil { - return nil, err + return nil, newError("failed to create file conn").Base(err).AtWarning() } return c, nil } From 1d3c8098e96d004c427613f242d02e65617fe706 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Thu, 26 Oct 2017 21:44:13 +0200 Subject: [PATCH 052/229] basic auth in http server --- proxy/http/config.go | 12 +++++ proxy/http/config.pb.go | 32 +++++++++---- proxy/http/config.proto | 3 +- proxy/http/server.go | 9 ++++ testing/scenarios/http_test.go | 84 +++++++++++++++++++++++++++++++++- 5 files changed, 128 insertions(+), 12 deletions(-) diff --git a/proxy/http/config.go b/proxy/http/config.go index d02cfda6..cbe486d5 100644 --- a/proxy/http/config.go +++ b/proxy/http/config.go @@ -1 +1,13 @@ package http + +func (sc *ServerConfig) HasAccount(username, password string) bool { + if sc.Accounts == nil { + return false + } + + p, found := sc.Accounts[username] + if !found { + return false + } + return p == password +} diff --git a/proxy/http/config.pb.go b/proxy/http/config.pb.go index 31474746..37df52f0 100644 --- a/proxy/http/config.pb.go +++ b/proxy/http/config.pb.go @@ -17,7 +17,8 @@ const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package // Config for HTTP proxy server. type ServerConfig struct { - Timeout uint32 `protobuf:"varint,1,opt,name=timeout" json:"timeout,omitempty"` + Timeout uint32 `protobuf:"varint,1,opt,name=timeout" json:"timeout,omitempty"` + Accounts map[string]string `protobuf:"bytes,2,rep,name=accounts" json:"accounts,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` } func (m *ServerConfig) Reset() { *m = ServerConfig{} } @@ -32,6 +33,13 @@ func (m *ServerConfig) GetTimeout() uint32 { return 0 } +func (m *ServerConfig) GetAccounts() map[string]string { + if m != nil { + return m.Accounts + } + return nil +} + // ClientConfig for HTTP proxy client. type ClientConfig struct { } @@ -49,16 +57,20 @@ func init() { func init() { proto.RegisterFile("v2ray.com/core/proxy/http/config.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 161 bytes of a gzipped FileDescriptorProto + // 238 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x2b, 0x33, 0x2a, 0x4a, 0xac, 0xd4, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0x2f, 0x4a, 0xd5, 0x2f, 0x28, 0xca, 0xaf, 0xa8, 0xd4, 0xcf, 0x28, 0x29, 0x29, 0xd0, 0x4f, 0xce, 0xcf, 0x4b, 0xcb, 0x4c, 0xd7, 0x2b, 0x28, 0xca, - 0x2f, 0xc9, 0x17, 0x12, 0x85, 0xa9, 0x2b, 0x4a, 0xd5, 0x03, 0xab, 0xd1, 0x03, 0xa9, 0x51, 0xd2, - 0xe0, 0xe2, 0x09, 0x4e, 0x2d, 0x2a, 0x4b, 0x2d, 0x72, 0x06, 0x2b, 0x16, 0x92, 0xe0, 0x62, 0x2f, - 0xc9, 0xcc, 0x4d, 0xcd, 0x2f, 0x2d, 0x91, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x0d, 0x82, 0x71, 0x95, - 0xf8, 0xb8, 0x78, 0x9c, 0x73, 0x32, 0x53, 0xf3, 0x4a, 0x20, 0x2a, 0x9d, 0xac, 0xb9, 0x24, 0x93, - 0xf3, 0x73, 0xf5, 0xb0, 0x1a, 0x1b, 0xc0, 0x18, 0xc5, 0x02, 0xa2, 0x57, 0x31, 0x89, 0x86, 0x19, - 0x05, 0x25, 0x56, 0xea, 0x39, 0x83, 0xe4, 0x03, 0xc0, 0xf2, 0x1e, 0x25, 0x25, 0x05, 0x49, 0x6c, - 0x60, 0x47, 0x19, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0xc9, 0xae, 0x86, 0xab, 0xbe, 0x00, 0x00, - 0x00, + 0x2f, 0xc9, 0x17, 0x12, 0x85, 0xa9, 0x2b, 0x4a, 0xd5, 0x03, 0xab, 0xd1, 0x03, 0xa9, 0x51, 0xda, + 0xc2, 0xc8, 0xc5, 0x13, 0x9c, 0x5a, 0x54, 0x96, 0x5a, 0xe4, 0x0c, 0x56, 0x2d, 0x24, 0xc1, 0xc5, + 0x5e, 0x92, 0x99, 0x9b, 0x9a, 0x5f, 0x5a, 0x22, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0x1b, 0x04, 0xe3, + 0x0a, 0xf9, 0x72, 0x71, 0x24, 0x26, 0x27, 0xe7, 0x97, 0xe6, 0x95, 0x14, 0x4b, 0x30, 0x29, 0x30, + 0x6b, 0x70, 0x1b, 0x19, 0xea, 0x61, 0x35, 0x54, 0x0f, 0xd9, 0x40, 0x3d, 0x47, 0xa8, 0x1e, 0xd7, + 0xbc, 0x92, 0xa2, 0xca, 0x20, 0xb8, 0x11, 0x52, 0xd6, 0x5c, 0xbc, 0x28, 0x52, 0x42, 0x02, 0x5c, + 0xcc, 0xd9, 0xa9, 0x95, 0x60, 0x5b, 0x39, 0x83, 0x40, 0x4c, 0x21, 0x11, 0x2e, 0xd6, 0xb2, 0xc4, + 0x9c, 0xd2, 0x54, 0x09, 0x26, 0xb0, 0x18, 0x84, 0x63, 0xc5, 0x64, 0xc1, 0xa8, 0xc4, 0xc7, 0xc5, + 0xe3, 0x9c, 0x93, 0x99, 0x9a, 0x57, 0x02, 0xb1, 0xc4, 0xc9, 0x9a, 0x4b, 0x32, 0x39, 0x3f, 0x17, + 0xbb, 0x73, 0x02, 0x18, 0xa3, 0x58, 0x40, 0xf4, 0x2a, 0x26, 0xd1, 0x30, 0xa3, 0xa0, 0xc4, 0x4a, + 0x3d, 0x67, 0x90, 0x7c, 0x00, 0x58, 0xde, 0xa3, 0xa4, 0xa4, 0x20, 0x89, 0x0d, 0x1c, 0x42, 0xc6, + 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x07, 0x0a, 0xdd, 0xc0, 0x4b, 0x01, 0x00, 0x00, } diff --git a/proxy/http/config.proto b/proxy/http/config.proto index 5cbfdb83..9d96f163 100644 --- a/proxy/http/config.proto +++ b/proxy/http/config.proto @@ -9,9 +9,10 @@ option java_multiple_files = true; // Config for HTTP proxy server. message ServerConfig { uint32 timeout = 1; + map accounts = 2; } // ClientConfig for HTTP proxy client. message ClientConfig { -} \ No newline at end of file +} diff --git a/proxy/http/server.go b/proxy/http/server.go index b13b75d4..bceef6a7 100644 --- a/proxy/http/server.go +++ b/proxy/http/server.go @@ -83,6 +83,15 @@ Start: } return trace } + + if len(s.config.Accounts) > 0 { + user, pass, ok := request.BasicAuth() + if !ok || !s.config.HasAccount(user, pass) { + _, err := conn.Write([]byte("HTTP/1.1 401 UNAUTHORIZED\r\n\r\n")) + return err + } + } + log.Trace(newError("request to Method [", request.Method, "] Host [", request.Host, "] with URL [", request.URL, "]")) conn.SetReadDeadline(time.Time{}) diff --git a/testing/scenarios/http_test.go b/testing/scenarios/http_test.go index ad7ede42..fbd12dfb 100644 --- a/testing/scenarios/http_test.go +++ b/testing/scenarios/http_test.go @@ -12,8 +12,8 @@ import ( "v2ray.com/core/common/serial" "v2ray.com/core/proxy/freedom" v2http "v2ray.com/core/proxy/http" - . "v2ray.com/ext/assert" v2httptest "v2ray.com/core/testing/servers/http" + . "v2ray.com/ext/assert" ) func TestHttpConformance(t *testing.T) { @@ -72,3 +72,85 @@ func TestHttpConformance(t *testing.T) { CloseAllServers(servers) } + +func TestHttpBasicAuth(t *testing.T) { + assert := With(t) + + httpServerPort := pickPort() + httpServer := &v2httptest.Server{ + Port: httpServerPort, + PathHandler: make(map[string]http.HandlerFunc), + } + _, err := httpServer.Start() + assert(err, IsNil) + defer httpServer.Close() + + serverPort := pickPort() + serverConfig := &core.Config{ + Inbound: []*proxyman.InboundHandlerConfig{ + { + ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ + PortRange: net.SinglePortRange(serverPort), + Listen: net.NewIPOrDomain(net.LocalHostIP), + }), + ProxySettings: serial.ToTypedMessage(&v2http.ServerConfig{ + Accounts: map[string]string{ + "a": "b", + }, + }), + }, + }, + Outbound: []*proxyman.OutboundHandlerConfig{ + { + ProxySettings: serial.ToTypedMessage(&freedom.Config{}), + }, + }, + } + + servers, err := InitializeServerConfigs(serverConfig) + assert(err, IsNil) + + { + transport := &http.Transport{ + Proxy: func(req *http.Request) (*url.URL, error) { + return url.Parse("http://127.0.0.1:" + serverPort.String()) + }, + } + + client := &http.Client{ + Transport: transport, + } + + { + resp, err := client.Get("http://127.0.0.1:" + httpServerPort.String()) + assert(err, IsNil) + assert(resp.StatusCode, Equals, 401) + } + + { + req, err := http.NewRequest("GET", "http://127.0.0.1:"+httpServerPort.String(), nil) + assert(err, IsNil) + + req.SetBasicAuth("a", "c") + resp, err := client.Do(req) + assert(err, IsNil) + assert(resp.StatusCode, Equals, 401) + } + + { + req, err := http.NewRequest("GET", "http://127.0.0.1:"+httpServerPort.String(), nil) + assert(err, IsNil) + + req.SetBasicAuth("a", "b") + resp, err := client.Do(req) + assert(err, IsNil) + assert(resp.StatusCode, Equals, 200) + + content, err := ioutil.ReadAll(resp.Body) + assert(err, IsNil) + assert(string(content), Equals, "Home") + } + } + + CloseAllServers(servers) +} From 6c9a60100d17f23cd240d1d8b66f7917e46384a2 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Thu, 26 Oct 2017 21:44:22 +0200 Subject: [PATCH 053/229] format code --- common/buf/buffered_reader_test.go | 2 +- common/buf/buffered_writer_test.go | 2 +- common/buf/writer_test.go | 2 +- common/protocol/time_test.go | 4 ++-- testing/scenarios/dns_test.go | 2 +- testing/scenarios/dokodemo_test.go | 2 +- testing/scenarios/feature_test.go | 2 +- testing/scenarios/shadowsocks_test.go | 2 +- testing/scenarios/socks_test.go | 2 +- testing/scenarios/tls_test.go | 2 +- testing/scenarios/transport_test.go | 2 +- testing/scenarios/vmess_test.go | 2 +- transport/internet/dialer_test.go | 4 ++-- transport/internet/header_test.go | 2 +- transport/internet/headers/http/http_test.go | 2 +- transport/internet/headers/srtp/srtp_test.go | 4 ++-- transport/internet/headers/utp/utp_test.go | 4 ++-- transport/internet/headers/wechat/wechat_test.go | 2 +- transport/internet/kcp/connection_test.go | 2 +- transport/internet/kcp/crypt_test.go | 2 +- transport/internet/kcp/kcp_test.go | 2 +- transport/internet/kcp/segment_test.go | 2 +- transport/ray/direct_test.go | 2 +- 23 files changed, 27 insertions(+), 27 deletions(-) diff --git a/common/buf/buffered_reader_test.go b/common/buf/buffered_reader_test.go index 7d23e407..d646ee03 100644 --- a/common/buf/buffered_reader_test.go +++ b/common/buf/buffered_reader_test.go @@ -26,7 +26,7 @@ func TestBufferedReader(t *testing.T) { assert(err, IsNil) len2 := content.Len() - assert(len - len2, GreaterThan, 16) + assert(len-len2, GreaterThan, 16) nBytes, err = reader.Read(payload) assert(nBytes, Equals, 16) diff --git a/common/buf/buffered_writer_test.go b/common/buf/buffered_writer_test.go index 12154ee6..9368633e 100644 --- a/common/buf/buffered_writer_test.go +++ b/common/buf/buffered_writer_test.go @@ -49,6 +49,6 @@ func TestBufferedWriterLargePayload(t *testing.T) { nBytes, err = writer.Write(payload[512:]) assert(err, IsNil) assert(writer.Flush(), IsNil) - assert(nBytes, Equals, 64*1024 - 512) + assert(nBytes, Equals, 64*1024-512) assert(content.Bytes(), Equals, payload) } diff --git a/common/buf/writer_test.go b/common/buf/writer_test.go index b9100690..69198f31 100644 --- a/common/buf/writer_test.go +++ b/common/buf/writer_test.go @@ -10,8 +10,8 @@ import ( "io" . "v2ray.com/core/common/buf" - . "v2ray.com/ext/assert" "v2ray.com/core/transport/ray" + . "v2ray.com/ext/assert" ) func TestWriter(t *testing.T) { diff --git a/common/protocol/time_test.go b/common/protocol/time_test.go index 8ed761e5..42b1c99d 100644 --- a/common/protocol/time_test.go +++ b/common/protocol/time_test.go @@ -17,7 +17,7 @@ func TestGenerateRandomInt64InRange(t *testing.T) { for i := 0; i < 100; i++ { val := int64(generator()) - assert(val, AtMost, base + int64(delta)) - assert(val, AtLeast, base - int64(delta)) + assert(val, AtMost, base+int64(delta)) + assert(val, AtLeast, base-int64(delta)) } } diff --git a/testing/scenarios/dns_test.go b/testing/scenarios/dns_test.go index 0360d157..66527077 100644 --- a/testing/scenarios/dns_test.go +++ b/testing/scenarios/dns_test.go @@ -14,8 +14,8 @@ import ( "v2ray.com/core/proxy/blackhole" "v2ray.com/core/proxy/freedom" "v2ray.com/core/proxy/socks" - . "v2ray.com/ext/assert" "v2ray.com/core/testing/servers/tcp" + . "v2ray.com/ext/assert" ) func TestResolveIP(t *testing.T) { diff --git a/testing/scenarios/dokodemo_test.go b/testing/scenarios/dokodemo_test.go index 9deee05b..b7e2d738 100644 --- a/testing/scenarios/dokodemo_test.go +++ b/testing/scenarios/dokodemo_test.go @@ -15,9 +15,9 @@ import ( "v2ray.com/core/proxy/vmess" "v2ray.com/core/proxy/vmess/inbound" "v2ray.com/core/proxy/vmess/outbound" - . "v2ray.com/ext/assert" "v2ray.com/core/testing/servers/tcp" "v2ray.com/core/testing/servers/udp" + . "v2ray.com/ext/assert" ) func TestDokodemoTCP(t *testing.T) { diff --git a/testing/scenarios/feature_test.go b/testing/scenarios/feature_test.go index 903fd943..7d1b84c0 100644 --- a/testing/scenarios/feature_test.go +++ b/testing/scenarios/feature_test.go @@ -24,10 +24,10 @@ import ( "v2ray.com/core/proxy/vmess" "v2ray.com/core/proxy/vmess/inbound" "v2ray.com/core/proxy/vmess/outbound" - . "v2ray.com/ext/assert" "v2ray.com/core/testing/servers/tcp" "v2ray.com/core/testing/servers/udp" "v2ray.com/core/transport/internet" + . "v2ray.com/ext/assert" ) func TestPassiveConnection(t *testing.T) { diff --git a/testing/scenarios/shadowsocks_test.go b/testing/scenarios/shadowsocks_test.go index 94d8a0e9..fb444c5c 100644 --- a/testing/scenarios/shadowsocks_test.go +++ b/testing/scenarios/shadowsocks_test.go @@ -15,9 +15,9 @@ import ( "v2ray.com/core/proxy/dokodemo" "v2ray.com/core/proxy/freedom" "v2ray.com/core/proxy/shadowsocks" - . "v2ray.com/ext/assert" "v2ray.com/core/testing/servers/tcp" "v2ray.com/core/testing/servers/udp" + . "v2ray.com/ext/assert" ) func TestShadowsocksAES256TCP(t *testing.T) { diff --git a/testing/scenarios/socks_test.go b/testing/scenarios/socks_test.go index 264ab2cd..5351ad1c 100644 --- a/testing/scenarios/socks_test.go +++ b/testing/scenarios/socks_test.go @@ -13,9 +13,9 @@ import ( "v2ray.com/core/proxy/dokodemo" "v2ray.com/core/proxy/freedom" "v2ray.com/core/proxy/socks" - . "v2ray.com/ext/assert" "v2ray.com/core/testing/servers/tcp" "v2ray.com/core/testing/servers/udp" + . "v2ray.com/ext/assert" ) func TestSocksBridgeTCP(t *testing.T) { diff --git a/testing/scenarios/tls_test.go b/testing/scenarios/tls_test.go index f60ba490..9186cfd5 100644 --- a/testing/scenarios/tls_test.go +++ b/testing/scenarios/tls_test.go @@ -16,12 +16,12 @@ import ( "v2ray.com/core/proxy/vmess" "v2ray.com/core/proxy/vmess/inbound" "v2ray.com/core/proxy/vmess/outbound" - . "v2ray.com/ext/assert" "v2ray.com/core/testing/servers/tcp" tlsgen "v2ray.com/core/testing/tls" "v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet/tls" "v2ray.com/core/transport/internet/websocket" + . "v2ray.com/ext/assert" ) func TestSimpleTLSConnection(t *testing.T) { diff --git a/testing/scenarios/transport_test.go b/testing/scenarios/transport_test.go index e5ae3269..a657366e 100644 --- a/testing/scenarios/transport_test.go +++ b/testing/scenarios/transport_test.go @@ -15,11 +15,11 @@ import ( "v2ray.com/core/proxy/vmess" "v2ray.com/core/proxy/vmess/inbound" "v2ray.com/core/proxy/vmess/outbound" - . "v2ray.com/ext/assert" "v2ray.com/core/testing/servers/tcp" "v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet/headers/http" tcptransport "v2ray.com/core/transport/internet/tcp" + . "v2ray.com/ext/assert" ) func TestHttpConnectionHeader(t *testing.T) { diff --git a/testing/scenarios/vmess_test.go b/testing/scenarios/vmess_test.go index d8c5edcf..0a10669e 100644 --- a/testing/scenarios/vmess_test.go +++ b/testing/scenarios/vmess_test.go @@ -18,10 +18,10 @@ import ( "v2ray.com/core/proxy/vmess" "v2ray.com/core/proxy/vmess/inbound" "v2ray.com/core/proxy/vmess/outbound" - . "v2ray.com/ext/assert" "v2ray.com/core/testing/servers/tcp" "v2ray.com/core/testing/servers/udp" "v2ray.com/core/transport/internet" + . "v2ray.com/ext/assert" ) func TestVMessDynamicPort(t *testing.T) { diff --git a/transport/internet/dialer_test.go b/transport/internet/dialer_test.go index 07ce0609..dbc9e587 100644 --- a/transport/internet/dialer_test.go +++ b/transport/internet/dialer_test.go @@ -5,9 +5,9 @@ import ( "testing" "v2ray.com/core/common/net" - . "v2ray.com/ext/assert" "v2ray.com/core/testing/servers/tcp" . "v2ray.com/core/transport/internet" + . "v2ray.com/ext/assert" ) func TestDialWithLocalAddr(t *testing.T) { @@ -20,6 +20,6 @@ func TestDialWithLocalAddr(t *testing.T) { conn, err := DialSystem(context.Background(), net.LocalHostIP, net.TCPDestination(net.LocalHostIP, dest.Port)) assert(err, IsNil) - assert(conn.RemoteAddr().String(), Equals, "127.0.0.1:" + dest.Port.String()) + assert(conn.RemoteAddr().String(), Equals, "127.0.0.1:"+dest.Port.String()) conn.Close() } diff --git a/transport/internet/header_test.go b/transport/internet/header_test.go index 4cfc72ee..65a7afa1 100644 --- a/transport/internet/header_test.go +++ b/transport/internet/header_test.go @@ -3,11 +3,11 @@ package internet_test import ( "testing" - . "v2ray.com/ext/assert" . "v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet/headers/noop" "v2ray.com/core/transport/internet/headers/srtp" "v2ray.com/core/transport/internet/headers/utp" + . "v2ray.com/ext/assert" ) func TestAllHeadersLoadable(t *testing.T) { diff --git a/transport/internet/headers/http/http_test.go b/transport/internet/headers/http/http_test.go index 37a990d2..26ff5fb0 100644 --- a/transport/internet/headers/http/http_test.go +++ b/transport/internet/headers/http/http_test.go @@ -8,8 +8,8 @@ import ( "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/common/serial" - . "v2ray.com/ext/assert" . "v2ray.com/core/transport/internet/headers/http" + . "v2ray.com/ext/assert" ) func TestReaderWriter(t *testing.T) { diff --git a/transport/internet/headers/srtp/srtp_test.go b/transport/internet/headers/srtp/srtp_test.go index 4417e1c7..db138fa5 100644 --- a/transport/internet/headers/srtp/srtp_test.go +++ b/transport/internet/headers/srtp/srtp_test.go @@ -4,8 +4,8 @@ import ( "testing" "v2ray.com/core/common/buf" - . "v2ray.com/ext/assert" . "v2ray.com/core/transport/internet/headers/srtp" + . "v2ray.com/ext/assert" ) func TestSRTPWrite(t *testing.T) { @@ -18,5 +18,5 @@ func TestSRTPWrite(t *testing.T) { payload.AppendSupplier(srtp.Write) payload.Append(content) - assert(payload.Len(), Equals, len(content) + srtp.Size()) + assert(payload.Len(), Equals, len(content)+srtp.Size()) } diff --git a/transport/internet/headers/utp/utp_test.go b/transport/internet/headers/utp/utp_test.go index 06760db3..eaffb70c 100644 --- a/transport/internet/headers/utp/utp_test.go +++ b/transport/internet/headers/utp/utp_test.go @@ -4,8 +4,8 @@ import ( "testing" "v2ray.com/core/common/buf" - . "v2ray.com/ext/assert" . "v2ray.com/core/transport/internet/headers/utp" + . "v2ray.com/ext/assert" ) func TestUTPWrite(t *testing.T) { @@ -18,5 +18,5 @@ func TestUTPWrite(t *testing.T) { payload.AppendSupplier(utp.Write) payload.Append(content) - assert(payload.Len(), Equals, len(content) + utp.Size()) + assert(payload.Len(), Equals, len(content)+utp.Size()) } diff --git a/transport/internet/headers/wechat/wechat_test.go b/transport/internet/headers/wechat/wechat_test.go index e3e840ea..9a26ffa4 100644 --- a/transport/internet/headers/wechat/wechat_test.go +++ b/transport/internet/headers/wechat/wechat_test.go @@ -4,8 +4,8 @@ import ( "testing" "v2ray.com/core/common/buf" - . "v2ray.com/ext/assert" . "v2ray.com/core/transport/internet/headers/wechat" + . "v2ray.com/ext/assert" ) func TestUTPWrite(t *testing.T) { diff --git a/transport/internet/kcp/connection_test.go b/transport/internet/kcp/connection_test.go index 786c320c..f397a34f 100644 --- a/transport/internet/kcp/connection_test.go +++ b/transport/internet/kcp/connection_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" - . "v2ray.com/ext/assert" . "v2ray.com/core/transport/internet/kcp" + . "v2ray.com/ext/assert" ) type NoOpConn struct{} diff --git a/transport/internet/kcp/crypt_test.go b/transport/internet/kcp/crypt_test.go index 52417076..b3db18b8 100644 --- a/transport/internet/kcp/crypt_test.go +++ b/transport/internet/kcp/crypt_test.go @@ -3,8 +3,8 @@ package kcp_test import ( "testing" - . "v2ray.com/ext/assert" . "v2ray.com/core/transport/internet/kcp" + . "v2ray.com/ext/assert" ) func TestSimpleAuthenticator(t *testing.T) { diff --git a/transport/internet/kcp/kcp_test.go b/transport/internet/kcp/kcp_test.go index 1d6dadd7..d7625b3b 100644 --- a/transport/internet/kcp/kcp_test.go +++ b/transport/internet/kcp/kcp_test.go @@ -9,9 +9,9 @@ import ( "time" "v2ray.com/core/common/net" - . "v2ray.com/ext/assert" "v2ray.com/core/transport/internet" . "v2ray.com/core/transport/internet/kcp" + . "v2ray.com/ext/assert" ) func TestDialAndListen(t *testing.T) { diff --git a/transport/internet/kcp/segment_test.go b/transport/internet/kcp/segment_test.go index 13247692..e13f89fc 100644 --- a/transport/internet/kcp/segment_test.go +++ b/transport/internet/kcp/segment_test.go @@ -4,8 +4,8 @@ import ( "testing" "v2ray.com/core/common/buf" - . "v2ray.com/ext/assert" . "v2ray.com/core/transport/internet/kcp" + . "v2ray.com/ext/assert" ) func TestBadSegment(t *testing.T) { diff --git a/transport/ray/direct_test.go b/transport/ray/direct_test.go index 6a16296c..4350d7ca 100644 --- a/transport/ray/direct_test.go +++ b/transport/ray/direct_test.go @@ -6,8 +6,8 @@ import ( "testing" "v2ray.com/core/common/buf" - . "v2ray.com/ext/assert" . "v2ray.com/core/transport/ray" + . "v2ray.com/ext/assert" ) func TestStreamIO(t *testing.T) { From 3b53fd7cd665ed81afd4c1b6de3b925ef8e77f84 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Thu, 26 Oct 2017 22:28:43 +0200 Subject: [PATCH 054/229] Update version --- core.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core.go b/core.go index 8191e0a0..65c2167c 100644 --- a/core.go +++ b/core.go @@ -18,7 +18,7 @@ import ( ) var ( - version = "2.44" + version = "2.45" build = "Custom" codename = "One for all" intro = "An unified platform for anti-censorship." From a1cf2998488e025f037dd97402239f347165df49 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 27 Oct 2017 11:40:18 +0200 Subject: [PATCH 055/229] reduce memory allocation in mux --- app/proxyman/mux/mux.go | 6 +++--- app/proxyman/mux/session.go | 12 ++++++++++-- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/app/proxyman/mux/mux.go b/app/proxyman/mux/mux.go index ab173220..da349a16 100644 --- a/app/proxyman/mux/mux.go +++ b/app/proxyman/mux/mux.go @@ -370,8 +370,7 @@ func (w *ServerWorker) handleStatusEnd(meta *FrameMetadata, reader io.Reader) er return nil } -func (w *ServerWorker) handleFrame(ctx context.Context, reader io.Reader) error { - metaReader := NewMetadataReader(reader) +func (w *ServerWorker) handleFrame(ctx context.Context, reader io.Reader, metaReader *MetadataReader) error { meta, err := metaReader.Read() if err != nil { return newError("failed to read metadata").Base(err) @@ -399,6 +398,7 @@ func (w *ServerWorker) handleFrame(ctx context.Context, reader io.Reader) error func (w *ServerWorker) run(ctx context.Context) { input := w.outboundRay.OutboundInput() reader := buf.ToBytesReader(input) + metaReader := NewMetadataReader(reader) defer w.sessionManager.Close() @@ -407,7 +407,7 @@ func (w *ServerWorker) run(ctx context.Context) { case <-ctx.Done(): return default: - err := w.handleFrame(ctx, reader) + err := w.handleFrame(ctx, reader, metaReader) if err != nil { if errors.Cause(err) != io.EOF { log.Trace(newError("unexpected EOF").Base(err)) diff --git a/app/proxyman/mux/session.go b/app/proxyman/mux/session.go index 0cb5592e..4e425f84 100644 --- a/app/proxyman/mux/session.go +++ b/app/proxyman/mux/session.go @@ -19,7 +19,7 @@ type SessionManager struct { func NewSessionManager() *SessionManager { return &SessionManager{ count: 0, - sessions: make(map[uint16]*Session, 32), + sessions: make(map[uint16]*Session, 16), } } @@ -58,6 +58,10 @@ func (m *SessionManager) Add(s *Session) { m.Lock() defer m.Unlock() + if m.closed { + return + } + m.sessions[s.ID] = s } @@ -65,6 +69,10 @@ func (m *SessionManager) Remove(id uint16) { m.Lock() defer m.Unlock() + if m.closed { + return + } + delete(m.sessions, id) } @@ -111,7 +119,7 @@ func (m *SessionManager) Close() { s.output.Close() } - m.sessions = make(map[uint16]*Session) + m.sessions = nil } type Session struct { From 27c099dd374fc77dde016a95f8a8290e21bc1d27 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 27 Oct 2017 16:32:00 +0200 Subject: [PATCH 056/229] simplify metadata reader --- app/proxyman/mux/mux.go | 10 ++++------ app/proxyman/mux/mux_test.go | 19 +++++++++---------- app/proxyman/mux/reader.go | 23 +++++++---------------- 3 files changed, 20 insertions(+), 32 deletions(-) diff --git a/app/proxyman/mux/mux.go b/app/proxyman/mux/mux.go index da349a16..17007b24 100644 --- a/app/proxyman/mux/mux.go +++ b/app/proxyman/mux/mux.go @@ -235,10 +235,9 @@ func (m *Client) fetchOutput() { defer m.cancel() reader := buf.ToBytesReader(m.inboundRay.InboundOutput()) - metaReader := NewMetadataReader(reader) for { - meta, err := metaReader.Read() + meta, err := ReadMetadata(reader) if err != nil { if errors.Cause(err) != io.EOF { log.Trace(newError("failed to read metadata").Base(err)) @@ -370,8 +369,8 @@ func (w *ServerWorker) handleStatusEnd(meta *FrameMetadata, reader io.Reader) er return nil } -func (w *ServerWorker) handleFrame(ctx context.Context, reader io.Reader, metaReader *MetadataReader) error { - meta, err := metaReader.Read() +func (w *ServerWorker) handleFrame(ctx context.Context, reader io.Reader) error { + meta, err := ReadMetadata(reader) if err != nil { return newError("failed to read metadata").Base(err) } @@ -398,7 +397,6 @@ func (w *ServerWorker) handleFrame(ctx context.Context, reader io.Reader, metaRe func (w *ServerWorker) run(ctx context.Context) { input := w.outboundRay.OutboundInput() reader := buf.ToBytesReader(input) - metaReader := NewMetadataReader(reader) defer w.sessionManager.Close() @@ -407,7 +405,7 @@ func (w *ServerWorker) run(ctx context.Context) { case <-ctx.Done(): return default: - err := w.handleFrame(ctx, reader, metaReader) + err := w.handleFrame(ctx, reader) if err != nil { if errors.Cause(err) != io.EOF { log.Trace(newError("unexpected EOF").Base(err)) diff --git a/app/proxyman/mux/mux_test.go b/app/proxyman/mux/mux_test.go index 775f87f8..70cebf69 100644 --- a/app/proxyman/mux/mux_test.go +++ b/app/proxyman/mux/mux_test.go @@ -61,10 +61,9 @@ func TestReaderWriter(t *testing.T) { writer2.Close() bytesReader := buf.ToBytesReader(stream) - metaReader := NewMetadataReader(bytesReader) streamReader := NewStreamReader(bytesReader) - meta, err := metaReader.Read() + meta, err := ReadMetadata(bytesReader) assert(err, IsNil) assert(meta.SessionID, Equals, uint16(1)) assert(byte(meta.SessionStatus), Equals, byte(SessionStatusNew)) @@ -76,14 +75,14 @@ func TestReaderWriter(t *testing.T) { assert(len(data), Equals, 1) assert(data[0].String(), Equals, "abcd") - meta, err = metaReader.Read() + meta, err = ReadMetadata(bytesReader) assert(err, IsNil) assert(byte(meta.SessionStatus), Equals, byte(SessionStatusNew)) assert(meta.SessionID, Equals, uint16(2)) assert(byte(meta.Option), Equals, byte(0)) assert(meta.Target, Equals, dest2) - meta, err = metaReader.Read() + meta, err = ReadMetadata(bytesReader) assert(err, IsNil) assert(byte(meta.SessionStatus), Equals, byte(SessionStatusKeep)) assert(meta.SessionID, Equals, uint16(1)) @@ -94,7 +93,7 @@ func TestReaderWriter(t *testing.T) { assert(len(data), Equals, 1) assert(data[0].String(), Equals, "efgh") - meta, err = metaReader.Read() + meta, err = ReadMetadata(bytesReader) assert(err, IsNil) assert(byte(meta.SessionStatus), Equals, byte(SessionStatusNew)) assert(meta.SessionID, Equals, uint16(3)) @@ -106,19 +105,19 @@ func TestReaderWriter(t *testing.T) { assert(len(data), Equals, 1) assert(data[0].String(), Equals, "x") - meta, err = metaReader.Read() + meta, err = ReadMetadata(bytesReader) assert(err, IsNil) assert(byte(meta.SessionStatus), Equals, byte(SessionStatusEnd)) assert(meta.SessionID, Equals, uint16(1)) assert(byte(meta.Option), Equals, byte(0)) - meta, err = metaReader.Read() + meta, err = ReadMetadata(bytesReader) assert(err, IsNil) assert(byte(meta.SessionStatus), Equals, byte(SessionStatusEnd)) assert(meta.SessionID, Equals, uint16(3)) assert(byte(meta.Option), Equals, byte(0)) - meta, err = metaReader.Read() + meta, err = ReadMetadata(bytesReader) assert(err, IsNil) assert(byte(meta.SessionStatus), Equals, byte(SessionStatusKeep)) assert(meta.SessionID, Equals, uint16(2)) @@ -129,7 +128,7 @@ func TestReaderWriter(t *testing.T) { assert(len(data), Equals, 1) assert(data[0].String(), Equals, "y") - meta, err = metaReader.Read() + meta, err = ReadMetadata(bytesReader) assert(err, IsNil) assert(byte(meta.SessionStatus), Equals, byte(SessionStatusEnd)) assert(meta.SessionID, Equals, uint16(2)) @@ -137,7 +136,7 @@ func TestReaderWriter(t *testing.T) { stream.Close() - meta, err = metaReader.Read() + meta, err = ReadMetadata(bytesReader) assert(err, IsNotNil) assert(meta, IsNil) } diff --git a/app/proxyman/mux/reader.go b/app/proxyman/mux/reader.go index d309f8df..af421325 100644 --- a/app/proxyman/mux/reader.go +++ b/app/proxyman/mux/reader.go @@ -7,20 +7,8 @@ import ( "v2ray.com/core/common/serial" ) -type MetadataReader struct { - reader io.Reader - buffer []byte -} - -func NewMetadataReader(reader io.Reader) *MetadataReader { - return &MetadataReader{ - reader: reader, - buffer: make([]byte, 1024), - } -} - -func (r *MetadataReader) Read() (*FrameMetadata, error) { - metaLen, err := serial.ReadUint16(r.reader) +func ReadMetadata(reader io.Reader) (*FrameMetadata, error) { + metaLen, err := serial.ReadUint16(reader) if err != nil { return nil, err } @@ -28,10 +16,13 @@ func (r *MetadataReader) Read() (*FrameMetadata, error) { return nil, newError("invalid metalen ", metaLen).AtWarning() } - if _, err := io.ReadFull(r.reader, r.buffer[:metaLen]); err != nil { + b := buf.New() + defer b.Release() + + if err := b.Reset(buf.ReadFullFrom(reader, int(metaLen))); err != nil { return nil, err } - return ReadFrameFrom(r.buffer) + return ReadFrameFrom(b.Bytes()) } type PacketReader struct { From 5901192a584734d086b23ff156ecc47c931ebed5 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 27 Oct 2017 17:13:43 +0200 Subject: [PATCH 057/229] fix udp in transparent proxy --- app/proxyman/inbound/worker.go | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/app/proxyman/inbound/worker.go b/app/proxyman/inbound/worker.go index 5783d970..4b74b541 100644 --- a/app/proxyman/inbound/worker.go +++ b/app/proxyman/inbound/worker.go @@ -172,6 +172,11 @@ func (*udpConn) SetWriteDeadline(time.Time) error { return nil } +type connId struct { + src net.Destination + dest net.Destination +} + type udpWorker struct { sync.RWMutex @@ -185,39 +190,43 @@ type udpWorker struct { ctx context.Context cancel context.CancelFunc - activeConn map[net.Destination]*udpConn + activeConn map[connId]*udpConn } -func (w *udpWorker) getConnection(src net.Destination) (*udpConn, bool) { +func (w *udpWorker) getConnection(id connId) (*udpConn, bool) { w.Lock() defer w.Unlock() - if conn, found := w.activeConn[src]; found { + if conn, found := w.activeConn[id]; found { return conn, true } conn := &udpConn{ input: make(chan *buf.Buffer, 32), output: func(b []byte) (int, error) { - return w.hub.WriteTo(b, src) + return w.hub.WriteTo(b, id.src) }, remote: &net.UDPAddr{ - IP: src.Address.IP(), - Port: int(src.Port), + IP: id.src.Address.IP(), + Port: int(id.src.Port), }, local: &net.UDPAddr{ IP: w.address.IP(), Port: int(w.port), }, } - w.activeConn[src] = conn + w.activeConn[id] = conn conn.updateActivity() return conn, false } func (w *udpWorker) callback(b *buf.Buffer, source net.Destination, originalDest net.Destination) { - conn, existing := w.getConnection(source) + id := connId{ + src: source, + dest: originalDest, + } + conn, existing := w.getConnection(id) select { case conn.input <- b: default: @@ -240,20 +249,20 @@ func (w *udpWorker) callback(b *buf.Buffer, source net.Destination, originalDest if err := w.proxy.Process(ctx, net.Network_UDP, conn, w.dispatcher); err != nil { log.Trace(newError("connection ends").Base(err)) } - w.removeConn(source) + w.removeConn(id) cancel() }() } } -func (w *udpWorker) removeConn(src net.Destination) { +func (w *udpWorker) removeConn(id connId) { w.Lock() - delete(w.activeConn, src) + delete(w.activeConn, id) w.Unlock() } func (w *udpWorker) Start() error { - w.activeConn = make(map[net.Destination]*udpConn) + w.activeConn = make(map[connId]*udpConn, 16) ctx, cancel := context.WithCancel(context.Background()) w.ctx = ctx w.cancel = cancel From 02685094d360c2004afe8e5ad6064d7d161efddf Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 27 Oct 2017 21:11:45 +0200 Subject: [PATCH 058/229] rewrite vmess encoding using buf --- proxy/vmess/encoding/client.go | 69 ++++++++++++++++++---------------- proxy/vmess/encoding/server.go | 66 +++++++++++++------------------- 2 files changed, 63 insertions(+), 72 deletions(-) diff --git a/proxy/vmess/encoding/client.go b/proxy/vmess/encoding/client.go index e35a3126..4a6142d0 100644 --- a/proxy/vmess/encoding/client.go +++ b/proxy/vmess/encoding/client.go @@ -71,57 +71,61 @@ func (c *ClientSession) EncodeRequestHeader(header *protocol.RequestHeader, writ common.Must2(idHash.Write(timestamp.Bytes(nil))) common.Must2(writer.Write(idHash.Sum(nil))) - buffer := make([]byte, 0, 512) - buffer = append(buffer, Version) - buffer = append(buffer, c.requestBodyIV...) - buffer = append(buffer, c.requestBodyKey...) - buffer = append(buffer, c.responseHeader, byte(header.Option)) + buffer := buf.New() + defer buffer.Release() + + buffer.AppendBytes(Version) + buffer.Append(c.requestBodyIV) + buffer.Append(c.requestBodyKey) + buffer.AppendBytes(c.responseHeader, byte(header.Option)) + padingLen := dice.Roll(16) if header.Security.Is(protocol.SecurityType_LEGACY) { // Disable padding in legacy mode for a smooth transition. padingLen = 0 } security := byte(padingLen<<4) | byte(header.Security) - buffer = append(buffer, security, byte(0), byte(header.Command)) + buffer.AppendBytes(security, byte(0), byte(header.Command)) if header.Command != protocol.RequestCommandMux { - buffer = header.Port.Bytes(buffer) + common.Must(buffer.AppendSupplier(serial.WriteUint16(header.Port.Value()))) switch header.Address.Family() { case net.AddressFamilyIPv4: - buffer = append(buffer, byte(protocol.AddressTypeIPv4)) - buffer = append(buffer, header.Address.IP()...) + buffer.AppendBytes(byte(protocol.AddressTypeIPv4)) + buffer.Append(header.Address.IP()) case net.AddressFamilyIPv6: - buffer = append(buffer, byte(protocol.AddressTypeIPv6)) - buffer = append(buffer, header.Address.IP()...) + buffer.AppendBytes(byte(protocol.AddressTypeIPv6)) + buffer.Append(header.Address.IP()) case net.AddressFamilyDomain: domain := header.Address.Domain() if protocol.IsDomainTooLong(domain) { return newError("long domain not supported: ", domain) } nDomain := len(domain) - buffer = append(buffer, byte(protocol.AddressTypeDomain), byte(nDomain)) - buffer = append(buffer, domain...) + buffer.AppendBytes(byte(protocol.AddressTypeDomain), byte(nDomain)) + common.Must(buffer.AppendSupplier(serial.WriteString(domain))) } } if padingLen > 0 { - pading := make([]byte, padingLen) - common.Must2(rand.Read(pading)) - buffer = append(buffer, pading...) + common.Must(buffer.AppendSupplier(buf.ReadFullFrom(rand.Reader, padingLen))) } fnv1a := fnv.New32a() - common.Must2(fnv1a.Write(buffer)) + common.Must2(fnv1a.Write(buffer.Bytes())) - buffer = fnv1a.Sum(buffer) + common.Must(buffer.AppendSupplier(func(b []byte) (int, error) { + fnv1a.Sum(b[:0]) + return fnv1a.Size(), nil + })) timestampHash := md5.New() common.Must2(timestampHash.Write(hashTimestamp(timestamp))) iv := timestampHash.Sum(nil) aesStream := crypto.NewAesEncryptionStream(account.(*vmess.InternalAccount).ID.CmdKey(), iv) - aesStream.XORKeyStream(buffer, buffer) - common.Must2(writer.Write(buffer)) + aesStream.XORKeyStream(buffer.Bytes(), buffer.Bytes()) + common.Must2(writer.Write(buffer.Bytes())) return nil } @@ -197,32 +201,31 @@ func (c *ClientSession) DecodeResponseHeader(reader io.Reader) (*protocol.Respon aesStream := crypto.NewAesDecryptionStream(c.responseBodyKey, c.responseBodyIV) c.responseReader = crypto.NewCryptionReader(aesStream, reader) - buffer := make([]byte, 256) + buffer := buf.New() + defer buffer.Release() - _, err := io.ReadFull(c.responseReader, buffer[:4]) - if err != nil { + if err := buffer.AppendSupplier(buf.ReadFullFrom(c.responseReader, 4)); err != nil { log.Trace(newError("failed to read response header").Base(err)) return nil, err } - if buffer[0] != c.responseHeader { - return nil, newError("unexpected response header. Expecting ", int(c.responseHeader), " but actually ", int(buffer[0])) + if buffer.Byte(0) != c.responseHeader { + return nil, newError("unexpected response header. Expecting ", int(c.responseHeader), " but actually ", int(buffer.Byte(0))) } header := &protocol.ResponseHeader{ - Option: bitmask.Byte(buffer[1]), + Option: bitmask.Byte(buffer.Byte(1)), } - if buffer[2] != 0 { - cmdID := buffer[2] - dataLen := int(buffer[3]) - _, err := io.ReadFull(c.responseReader, buffer[:dataLen]) - if err != nil { + if buffer.Byte(2) != 0 { + cmdID := buffer.Byte(2) + dataLen := int(buffer.Byte(3)) + + if err := buffer.Reset(buf.ReadFullFrom(c.responseReader, dataLen)); err != nil { log.Trace(newError("failed to read response command").Base(err)) return nil, err } - data := buffer[:dataLen] - command, err := UnmarshalCommand(cmdID, data) + command, err := UnmarshalCommand(cmdID, buffer.Bytes()) if err == nil { header.Command = command } diff --git a/proxy/vmess/encoding/server.go b/proxy/vmess/encoding/server.go index fc0a95b6..0859ed82 100644 --- a/proxy/vmess/encoding/server.go +++ b/proxy/vmess/encoding/server.go @@ -115,14 +115,14 @@ func NewServerSession(validator protocol.UserValidator, sessionHistory *SessionH } func (s *ServerSession) DecodeRequestHeader(reader io.Reader) (*protocol.RequestHeader, error) { - buffer := make([]byte, 512) + buffer := buf.New() + defer buffer.Release() - _, err := io.ReadFull(reader, buffer[:protocol.IDBytesLen]) - if err != nil { + if err := buffer.AppendSupplier(buf.ReadFullFrom(reader, protocol.IDBytesLen)); err != nil { return nil, newError("failed to read request header").Base(err) } - user, timestamp, valid := s.userValidator.Get(buffer[:protocol.IDBytesLen]) + user, timestamp, valid := s.userValidator.Get(buffer.Bytes()) if !valid { return nil, newError("invalid user") } @@ -139,23 +139,21 @@ func (s *ServerSession) DecodeRequestHeader(reader io.Reader) (*protocol.Request aesStream := crypto.NewAesDecryptionStream(vmessAccount.ID.CmdKey(), iv) decryptor := crypto.NewCryptionReader(aesStream, reader) - nBytes, err := io.ReadFull(decryptor, buffer[:41]) - if err != nil { + if err := buffer.Reset(buf.ReadFullFrom(decryptor, 41)); err != nil { return nil, newError("failed to read request header").Base(err) } - bufferLen := nBytes request := &protocol.RequestHeader{ User: user, - Version: buffer[0], + Version: buffer.Byte(0), } if request.Version != Version { return nil, newError("invalid protocol version ", request.Version) } - s.requestBodyIV = append([]byte(nil), buffer[1:17]...) // 16 bytes - s.requestBodyKey = append([]byte(nil), buffer[17:33]...) // 16 bytes + s.requestBodyIV = append([]byte(nil), buffer.BytesRange(1, 17)...) // 16 bytes + s.requestBodyKey = append([]byte(nil), buffer.BytesRange(17, 33)...) // 16 bytes var sid sessionId copy(sid.user[:], vmessAccount.ID.Bytes()) copy(sid.key[:], s.requestBodyKey) @@ -165,66 +163,56 @@ func (s *ServerSession) DecodeRequestHeader(reader io.Reader) (*protocol.Request } s.sessionHistory.add(sid) - s.responseHeader = buffer[33] // 1 byte - request.Option = bitmask.Byte(buffer[34]) // 1 byte - padingLen := int(buffer[35] >> 4) - request.Security = protocol.NormSecurity(protocol.Security(buffer[35] & 0x0F)) + s.responseHeader = buffer.Byte(33) // 1 byte + request.Option = bitmask.Byte(buffer.Byte(34)) // 1 byte + padingLen := int(buffer.Byte(35) >> 4) + request.Security = protocol.NormSecurity(protocol.Security(buffer.Byte(35) & 0x0F)) // 1 bytes reserved - request.Command = protocol.RequestCommand(buffer[37]) + request.Command = protocol.RequestCommand(buffer.Byte(37)) if request.Command != protocol.RequestCommandMux { - request.Port = net.PortFromBytes(buffer[38:40]) + request.Port = net.PortFromBytes(buffer.BytesRange(38, 40)) - switch protocol.AddressType(buffer[40]) { + switch protocol.AddressType(buffer.Byte(40)) { case protocol.AddressTypeIPv4: - _, err = io.ReadFull(decryptor, buffer[41:45]) // 4 bytes - bufferLen += 4 - if err != nil { + if err := buffer.AppendSupplier(buf.ReadFullFrom(decryptor, 4)); err != nil { return nil, newError("failed to read IPv4 address").Base(err) } - request.Address = net.IPAddress(buffer[41:45]) + request.Address = net.IPAddress(buffer.BytesFrom(-4)) case protocol.AddressTypeIPv6: - _, err = io.ReadFull(decryptor, buffer[41:57]) // 16 bytes - bufferLen += 16 - if err != nil { + if err := buffer.AppendSupplier(buf.ReadFullFrom(decryptor, 16)); err != nil { return nil, newError("failed to read IPv6 address").Base(err) } - request.Address = net.IPAddress(buffer[41:57]) + request.Address = net.IPAddress(buffer.BytesFrom(-16)) case protocol.AddressTypeDomain: - _, err = io.ReadFull(decryptor, buffer[41:42]) - if err != nil { + if err := buffer.AppendSupplier(buf.ReadFullFrom(decryptor, 1)); err != nil { return nil, newError("failed to read domain address").Base(err) } - domainLength := int(buffer[41]) + domainLength := int(buffer.Byte(buffer.Len() - 1)) if domainLength == 0 { return nil, newError("zero length domain").Base(err) } - _, err = io.ReadFull(decryptor, buffer[42:42+domainLength]) - if err != nil { + if err := buffer.AppendSupplier(buf.ReadFullFrom(decryptor, domainLength)); err != nil { return nil, newError("failed to read domain address").Base(err) } - bufferLen += 1 + domainLength - request.Address = net.DomainAddress(string(buffer[42 : 42+domainLength])) + request.Address = net.DomainAddress(string(buffer.BytesFrom(-domainLength))) } } if padingLen > 0 { - _, err = io.ReadFull(decryptor, buffer[bufferLen:bufferLen+padingLen]) - if err != nil { + if err := buffer.AppendSupplier(buf.ReadFullFrom(decryptor, padingLen)); err != nil { return nil, newError("failed to read padding").Base(err) } - bufferLen += padingLen } - _, err = io.ReadFull(decryptor, buffer[bufferLen:bufferLen+4]) - if err != nil { + if err := buffer.AppendSupplier(buf.ReadFullFrom(decryptor, 4)); err != nil { return nil, newError("failed to read checksum").Base(err) } fnv1a := fnv.New32a() - common.Must2(fnv1a.Write(buffer[:bufferLen])) + common.Must2(fnv1a.Write(buffer.BytesTo(-4))) actualHash := fnv1a.Sum32() - expectedHash := serial.BytesToUint32(buffer[bufferLen : bufferLen+4]) + expectedHash := serial.BytesToUint32(buffer.BytesFrom(-4)) if actualHash != expectedHash { return nil, newError("invalid auth") From 100391fdb79b1416f04d829b498daaf2548b5276 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sat, 28 Oct 2017 14:25:22 +0200 Subject: [PATCH 059/229] fix http basic auth. fix #659 --- proxy/http/server.go | 20 +++++++++++++++++++- testing/scenarios/http_test.go | 10 ++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/proxy/http/server.go b/proxy/http/server.go index bceef6a7..e5a0a10a 100644 --- a/proxy/http/server.go +++ b/proxy/http/server.go @@ -3,6 +3,7 @@ package http import ( "bufio" "context" + "encoding/base64" "io" "net/http" "runtime" @@ -69,6 +70,23 @@ func isTimeout(err error) bool { return ok && nerr.Timeout() } +func parseBasicAuth(auth string) (username, password string, ok bool) { + const prefix = "Basic " + if !strings.HasPrefix(auth, prefix) { + return + } + c, err := base64.StdEncoding.DecodeString(auth[len(prefix):]) + if err != nil { + return + } + cs := string(c) + s := strings.IndexByte(cs, ':') + if s < 0 { + return + } + return cs[:s], cs[s+1:], true +} + func (s *Server) Process(ctx context.Context, network net.Network, conn internet.Connection, dispatcher dispatcher.Interface) error { reader := bufio.NewReaderSize(conn, 2048) @@ -85,7 +103,7 @@ Start: } if len(s.config.Accounts) > 0 { - user, pass, ok := request.BasicAuth() + user, pass, ok := parseBasicAuth(request.Header.Get("Proxy-Authorization")) if !ok || !s.config.HasAccount(user, pass) { _, err := conn.Write([]byte("HTTP/1.1 401 UNAUTHORIZED\r\n\r\n")) return err diff --git a/testing/scenarios/http_test.go b/testing/scenarios/http_test.go index fbd12dfb..d92d99f7 100644 --- a/testing/scenarios/http_test.go +++ b/testing/scenarios/http_test.go @@ -73,6 +73,12 @@ func TestHttpConformance(t *testing.T) { CloseAllServers(servers) } +func setProxyBasicAuth(req *http.Request, user, pass string) { + req.SetBasicAuth(user, pass) + req.Header.Set("Proxy-Authorization", req.Header.Get("Authorization")) + req.Header.Del("Authorization") +} + func TestHttpBasicAuth(t *testing.T) { assert := With(t) @@ -131,7 +137,7 @@ func TestHttpBasicAuth(t *testing.T) { req, err := http.NewRequest("GET", "http://127.0.0.1:"+httpServerPort.String(), nil) assert(err, IsNil) - req.SetBasicAuth("a", "c") + setProxyBasicAuth(req, "a", "c") resp, err := client.Do(req) assert(err, IsNil) assert(resp.StatusCode, Equals, 401) @@ -141,7 +147,7 @@ func TestHttpBasicAuth(t *testing.T) { req, err := http.NewRequest("GET", "http://127.0.0.1:"+httpServerPort.String(), nil) assert(err, IsNil) - req.SetBasicAuth("a", "b") + setProxyBasicAuth(req, "a", "b") resp, err := client.Do(req) assert(err, IsNil) assert(resp.StatusCode, Equals, 200) From ac5ab6786251d035c0fa20dd37165e4010f1401c Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sat, 28 Oct 2017 21:28:50 +0200 Subject: [PATCH 060/229] refactor --- transport/internet/udp/hub.go | 45 ++++++++++++++++------------------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/transport/internet/udp/hub.go b/transport/internet/udp/hub.go index f54c5e70..d5382c15 100644 --- a/transport/internet/udp/hub.go +++ b/transport/internet/udp/hub.go @@ -38,15 +38,16 @@ func NewPayloadQueue(option ListenOption) *PayloadQueue { return queue } -func (v *PayloadQueue) Enqueue(payload Payload) { - size := len(v.queue) +// Enqueue adds the payload to the end of this queue. +func (q *PayloadQueue) Enqueue(payload Payload) { + size := len(q.queue) idx := 0 if size > 1 { idx = dice.Roll(size) } for i := 0; i < size; i++ { select { - case v.queue[idx%size] <- payload: + case q.queue[idx%size] <- payload: return default: idx++ @@ -54,14 +55,14 @@ func (v *PayloadQueue) Enqueue(payload Payload) { } } -func (v *PayloadQueue) Dequeue(queue <-chan Payload) { +func (q *PayloadQueue) Dequeue(queue <-chan Payload) { for payload := range queue { - v.callback(payload.payload, payload.source, payload.originalDest) + q.callback(payload.payload, payload.source, payload.originalDest) } } -func (v *PayloadQueue) Close() { - for _, queue := range v.queue { +func (q *PayloadQueue) Close() { + for _, queue := range q.queue { close(queue) } } @@ -116,19 +117,19 @@ func ListenUDP(address net.Address, port net.Port, option ListenOption) (*Hub, e return hub, nil } -func (v *Hub) Close() { - v.cancel() - v.conn.Close() +func (h *Hub) Close() { + h.cancel() + h.conn.Close() } -func (v *Hub) WriteTo(payload []byte, dest net.Destination) (int, error) { - return v.conn.WriteToUDP(payload, &net.UDPAddr{ +func (h *Hub) WriteTo(payload []byte, dest net.Destination) (int, error) { + return h.conn.WriteToUDP(payload, &net.UDPAddr{ IP: dest.Address.IP(), Port: int(dest.Port), }) } -func (v *Hub) start(ctx context.Context) { +func (h *Hub) start(ctx context.Context) { oobBytes := make([]byte, 256) L: for { @@ -142,7 +143,7 @@ L: var noob int var addr *net.UDPAddr err := buffer.AppendSupplier(func(b []byte) (int, error) { - n, nb, _, a, e := ReadUDPMsg(v.conn, b, oobBytes) + n, nb, _, a, e := ReadUDPMsg(h.conn, b, oobBytes) noob = nb addr = a return n, e @@ -158,20 +159,14 @@ L: payload: buffer, } payload.source = net.UDPDestination(net.IPAddress(addr.IP), net.Port(addr.Port)) - if v.option.ReceiveOriginalDest && noob > 0 { + if h.option.ReceiveOriginalDest && noob > 0 { payload.originalDest = RetrieveOriginalDest(oobBytes[:noob]) } - v.queue.Enqueue(payload) + h.queue.Enqueue(payload) } - v.queue.Close() + h.queue.Close() } -// Connection returns the net.Conn underneath this hub. -// Private: Visible for testing only -func (v *Hub) Connection() net.Conn { - return v.conn -} - -func (v *Hub) Addr() net.Addr { - return v.conn.LocalAddr() +func (h *Hub) Addr() net.Addr { + return h.conn.LocalAddr() } From 8e5c7a89bb7b0838553fe7f3ae1de24ef22237ea Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 29 Oct 2017 22:16:20 +0100 Subject: [PATCH 061/229] Update version --- core.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core.go b/core.go index 65c2167c..6693d16a 100644 --- a/core.go +++ b/core.go @@ -18,7 +18,7 @@ import ( ) var ( - version = "2.45" + version = "2.46" build = "Custom" codename = "One for all" intro = "An unified platform for anti-censorship." From c3fc27f7a17628dc013dd7399f12a7e1c0297666 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Mon, 30 Oct 2017 12:36:31 +0100 Subject: [PATCH 062/229] comments --- app/proxyman/mux/reader.go | 7 +++++++ app/proxyman/mux/session.go | 2 ++ 2 files changed, 9 insertions(+) diff --git a/app/proxyman/mux/reader.go b/app/proxyman/mux/reader.go index af421325..5b01a490 100644 --- a/app/proxyman/mux/reader.go +++ b/app/proxyman/mux/reader.go @@ -7,6 +7,7 @@ import ( "v2ray.com/core/common/serial" ) +// ReadMetadata reads FrameMetadata from the given reader. func ReadMetadata(reader io.Reader) (*FrameMetadata, error) { metaLen, err := serial.ReadUint16(reader) if err != nil { @@ -25,11 +26,13 @@ func ReadMetadata(reader io.Reader) (*FrameMetadata, error) { return ReadFrameFrom(b.Bytes()) } +// PacketReader is an io.Reader that reads whole chunk of Mux frames every time. type PacketReader struct { reader io.Reader eof bool } +// NewPacketReader creates a new PacketReader. func NewPacketReader(reader io.Reader) *PacketReader { return &PacketReader{ reader: reader, @@ -37,6 +40,7 @@ func NewPacketReader(reader io.Reader) *PacketReader { } } +// Read implements buf.Reader. func (r *PacketReader) Read() (buf.MultiBuffer, error) { if r.eof { return nil, io.EOF @@ -61,11 +65,13 @@ func (r *PacketReader) Read() (buf.MultiBuffer, error) { return buf.NewMultiBufferValue(b), nil } +// StreamReader reads Mux frame as a stream. type StreamReader struct { reader io.Reader leftOver int } +// NewStreamReader creates a new StreamReader. func NewStreamReader(reader io.Reader) *StreamReader { return &StreamReader{ reader: reader, @@ -73,6 +79,7 @@ func NewStreamReader(reader io.Reader) *StreamReader { } } +// Read implmenets buf.Reader. func (r *StreamReader) Read() (buf.MultiBuffer, error) { if r.leftOver == 0 { r.leftOver = -1 diff --git a/app/proxyman/mux/session.go b/app/proxyman/mux/session.go index 4e425f84..8704a0d4 100644 --- a/app/proxyman/mux/session.go +++ b/app/proxyman/mux/session.go @@ -122,6 +122,7 @@ func (m *SessionManager) Close() { m.sessions = nil } +// Session represents a client connection in a Mux connection. type Session struct { input ray.InputStream output ray.OutputStream @@ -137,6 +138,7 @@ func (s *Session) Close() { s.parent.Remove(s.ID) } +// NewReader creates a buf.Reader based on the transfer type of this Session. func (s *Session) NewReader(reader io.Reader) buf.Reader { if s.transferType == protocol.TransferTypeStream { return NewStreamReader(reader) From 08ece5d2bf854277f82999dbc25c19d705b0438a Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Mon, 30 Oct 2017 21:14:04 +0100 Subject: [PATCH 063/229] default security to auto --- common/protocol/headers.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/common/protocol/headers.go b/common/protocol/headers.go index 00945f8e..1304a7e4 100644 --- a/common/protocol/headers.go +++ b/common/protocol/headers.go @@ -86,10 +86,7 @@ type CommandSwitchAccount struct { } func (sc *SecurityConfig) AsSecurity() Security { - if sc == nil { - return Security(SecurityType_LEGACY) - } - if sc.Type == SecurityType_AUTO { + if sc == nil || sc.Type == SecurityType_AUTO { if runtime.GOARCH == "amd64" || runtime.GOARCH == "s390x" { return Security(SecurityType_AES128_GCM) } From 3545d20b1c4ea4d183e2c065af88c1121428e277 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Thu, 2 Nov 2017 10:54:06 +0100 Subject: [PATCH 064/229] protobuf for geoip --- app/router/config.pb.go | 122 +++++++++++++++++++++++++++------------- app/router/config.proto | 9 +++ 2 files changed, 93 insertions(+), 38 deletions(-) diff --git a/app/router/config.pb.go b/app/router/config.pb.go index 9dcd027c..9e856163 100644 --- a/app/router/config.pb.go +++ b/app/router/config.pb.go @@ -70,7 +70,7 @@ var Config_DomainStrategy_value = map[string]int32{ func (x Config_DomainStrategy) String() string { return proto.EnumName(Config_DomainStrategy_name, int32(x)) } -func (Config_DomainStrategy) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{3, 0} } +func (Config_DomainStrategy) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{5, 0} } // Domain for routing decision. type Domain struct { @@ -126,6 +126,46 @@ func (m *CIDR) GetPrefix() uint32 { return 0 } +type GeoIP struct { + CountryCode string `protobuf:"bytes,1,opt,name=country_code,json=countryCode" json:"country_code,omitempty"` + Cidr []*CIDR `protobuf:"bytes,2,rep,name=cidr" json:"cidr,omitempty"` +} + +func (m *GeoIP) Reset() { *m = GeoIP{} } +func (m *GeoIP) String() string { return proto.CompactTextString(m) } +func (*GeoIP) ProtoMessage() {} +func (*GeoIP) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } + +func (m *GeoIP) GetCountryCode() string { + if m != nil { + return m.CountryCode + } + return "" +} + +func (m *GeoIP) GetCidr() []*CIDR { + if m != nil { + return m.Cidr + } + return nil +} + +type GeoIPList struct { + Entry []*GeoIP `protobuf:"bytes,1,rep,name=entry" json:"entry,omitempty"` +} + +func (m *GeoIPList) Reset() { *m = GeoIPList{} } +func (m *GeoIPList) String() string { return proto.CompactTextString(m) } +func (*GeoIPList) ProtoMessage() {} +func (*GeoIPList) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } + +func (m *GeoIPList) GetEntry() []*GeoIP { + if m != nil { + return m.Entry + } + return nil +} + type RoutingRule struct { Tag string `protobuf:"bytes,1,opt,name=tag" json:"tag,omitempty"` Domain []*Domain `protobuf:"bytes,2,rep,name=domain" json:"domain,omitempty"` @@ -140,7 +180,7 @@ type RoutingRule struct { func (m *RoutingRule) Reset() { *m = RoutingRule{} } func (m *RoutingRule) String() string { return proto.CompactTextString(m) } func (*RoutingRule) ProtoMessage() {} -func (*RoutingRule) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } +func (*RoutingRule) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } func (m *RoutingRule) GetTag() string { if m != nil { @@ -206,7 +246,7 @@ type Config struct { func (m *Config) Reset() { *m = Config{} } func (m *Config) String() string { return proto.CompactTextString(m) } func (*Config) ProtoMessage() {} -func (*Config) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } +func (*Config) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } func (m *Config) GetDomainStrategy() Config_DomainStrategy { if m != nil { @@ -225,6 +265,8 @@ func (m *Config) GetRule() []*RoutingRule { func init() { proto.RegisterType((*Domain)(nil), "v2ray.core.app.router.Domain") proto.RegisterType((*CIDR)(nil), "v2ray.core.app.router.CIDR") + proto.RegisterType((*GeoIP)(nil), "v2ray.core.app.router.GeoIP") + proto.RegisterType((*GeoIPList)(nil), "v2ray.core.app.router.GeoIPList") proto.RegisterType((*RoutingRule)(nil), "v2ray.core.app.router.RoutingRule") proto.RegisterType((*Config)(nil), "v2ray.core.app.router.Config") proto.RegisterEnum("v2ray.core.app.router.Domain_Type", Domain_Type_name, Domain_Type_value) @@ -234,39 +276,43 @@ func init() { func init() { proto.RegisterFile("v2ray.com/core/app/router/config.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 538 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x93, 0xc1, 0x6e, 0xd4, 0x30, - 0x10, 0x86, 0x49, 0x76, 0x1b, 0xba, 0x93, 0xb2, 0x44, 0x16, 0x45, 0xa1, 0xa8, 0x22, 0x8a, 0x10, - 0xe4, 0x80, 0x12, 0x69, 0x11, 0x70, 0x01, 0xa1, 0xb2, 0xed, 0x61, 0x25, 0xa8, 0x2a, 0xd3, 0x72, - 0xe0, 0x12, 0xb9, 0x59, 0x37, 0x58, 0x24, 0xb6, 0xe5, 0x38, 0xa5, 0x7b, 0xe3, 0x05, 0x78, 0x11, - 0x9e, 0x86, 0x47, 0x42, 0xb6, 0x53, 0xd1, 0xa2, 0x2e, 0xdc, 0x66, 0x9c, 0xef, 0x9f, 0x19, 0x8f, - 0xff, 0xc0, 0x93, 0xf3, 0x99, 0x22, 0xab, 0xbc, 0x12, 0x6d, 0x51, 0x09, 0x45, 0x0b, 0x22, 0x65, - 0xa1, 0x44, 0xaf, 0xa9, 0x2a, 0x2a, 0xc1, 0xcf, 0x58, 0x9d, 0x4b, 0x25, 0xb4, 0x40, 0xdb, 0x97, - 0x9c, 0xa2, 0x39, 0x91, 0x32, 0x77, 0xcc, 0xce, 0xe3, 0xbf, 0xe4, 0x95, 0x68, 0x5b, 0xc1, 0x0b, - 0x4e, 0x75, 0x21, 0x85, 0xd2, 0x4e, 0xbc, 0xf3, 0x74, 0x3d, 0xc5, 0xa9, 0xfe, 0x26, 0xd4, 0x57, - 0x07, 0xa6, 0xdf, 0x3d, 0x08, 0xf6, 0x45, 0x4b, 0x18, 0x47, 0x2f, 0x61, 0xac, 0x57, 0x92, 0xc6, - 0x5e, 0xe2, 0x65, 0xd3, 0x59, 0x9a, 0xdf, 0xd8, 0x3f, 0x77, 0x70, 0x7e, 0xbc, 0x92, 0x14, 0x5b, - 0x1e, 0xdd, 0x83, 0x8d, 0x73, 0xd2, 0xf4, 0x34, 0xf6, 0x13, 0x2f, 0x9b, 0x60, 0x97, 0xa4, 0x19, - 0x8c, 0x0d, 0x83, 0x26, 0xb0, 0x71, 0xd4, 0x10, 0xc6, 0xa3, 0x5b, 0x26, 0xc4, 0xb4, 0xa6, 0x17, - 0x91, 0x87, 0xe0, 0xb2, 0x6b, 0xe4, 0xa7, 0x39, 0x8c, 0xe7, 0x8b, 0x7d, 0x8c, 0xa6, 0xe0, 0x33, - 0x69, 0xbb, 0x6f, 0x61, 0x9f, 0x49, 0x74, 0x1f, 0x02, 0xa9, 0xe8, 0x19, 0xbb, 0xb0, 0x85, 0xef, - 0xe0, 0x21, 0x4b, 0x7f, 0x8c, 0x20, 0xc4, 0xa2, 0xd7, 0x8c, 0xd7, 0xb8, 0x6f, 0x28, 0x8a, 0x60, - 0xa4, 0x49, 0x6d, 0x85, 0x13, 0x6c, 0x42, 0xf4, 0x02, 0x82, 0xa5, 0xad, 0x1e, 0xfb, 0xc9, 0x28, - 0x0b, 0x67, 0xbb, 0xff, 0xbc, 0x0b, 0x1e, 0x60, 0x54, 0xc0, 0xb8, 0x62, 0x4b, 0x15, 0x8f, 0xac, - 0xe8, 0xe1, 0x1a, 0x91, 0x99, 0x15, 0x5b, 0x10, 0xbd, 0x05, 0x30, 0x3b, 0x2f, 0x15, 0xe1, 0x35, - 0x8d, 0xc7, 0x89, 0x97, 0x85, 0xb3, 0xe4, 0xaa, 0xcc, 0xad, 0x3d, 0xe7, 0x54, 0xe7, 0x47, 0x42, - 0x69, 0x6c, 0x38, 0x3c, 0x91, 0x97, 0x21, 0x3a, 0x80, 0xad, 0xe1, 0x39, 0xca, 0x86, 0x75, 0x3a, - 0xde, 0xb0, 0x25, 0xd2, 0x35, 0x25, 0x0e, 0x1d, 0xfa, 0x9e, 0x75, 0x1a, 0x87, 0xfc, 0x4f, 0x82, - 0x5e, 0x43, 0xd8, 0x89, 0x5e, 0x55, 0xb4, 0xb4, 0xf3, 0x07, 0xff, 0x9f, 0x1f, 0x1c, 0x3f, 0x37, - 0xb7, 0xd8, 0x05, 0xe8, 0x3b, 0xaa, 0x4a, 0xda, 0x12, 0xd6, 0xc4, 0xb7, 0x93, 0x51, 0x36, 0xc1, - 0x13, 0x73, 0x72, 0x60, 0x0e, 0xd0, 0x23, 0x08, 0x19, 0x3f, 0x15, 0x3d, 0x5f, 0x96, 0x66, 0xcd, - 0x9b, 0xf6, 0x3b, 0x0c, 0x47, 0xc7, 0xa4, 0x4e, 0x7f, 0x79, 0x10, 0xcc, 0xad, 0x73, 0xd1, 0x09, - 0xdc, 0x75, 0xbb, 0x2c, 0x3b, 0xad, 0x88, 0xa6, 0xf5, 0x6a, 0x70, 0xd3, 0xb3, 0x75, 0xc3, 0x38, - 0xc7, 0xbb, 0x87, 0xf8, 0x38, 0x68, 0xf0, 0x74, 0x79, 0x2d, 0x37, 0xce, 0x54, 0x7d, 0x43, 0x87, - 0xd7, 0x5c, 0xe7, 0xcc, 0x2b, 0x9e, 0xc0, 0x96, 0x4f, 0x5f, 0xc1, 0xf4, 0x7a, 0x65, 0xb4, 0x09, - 0xe3, 0xbd, 0x6e, 0xd1, 0x39, 0x33, 0x9e, 0x74, 0x74, 0x21, 0x23, 0x0f, 0x45, 0xb0, 0xb5, 0x90, - 0x8b, 0xb3, 0x43, 0xc1, 0x3f, 0x10, 0x5d, 0x7d, 0x89, 0xfc, 0x77, 0x6f, 0xe0, 0x41, 0x25, 0xda, - 0x9b, 0xfb, 0x1c, 0x79, 0x9f, 0x03, 0x17, 0xfd, 0xf4, 0xb7, 0x3f, 0xcd, 0x30, 0x59, 0xe5, 0x73, - 0x43, 0xec, 0x49, 0x69, 0x47, 0xa0, 0xea, 0x34, 0xb0, 0xff, 0xd6, 0xf3, 0xdf, 0x01, 0x00, 0x00, - 0xff, 0xff, 0xa7, 0x6a, 0x97, 0x93, 0xeb, 0x03, 0x00, 0x00, + // 595 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0xc1, 0x6e, 0xd3, 0x4c, + 0x10, 0xc7, 0x3f, 0x3b, 0x89, 0xbf, 0x7a, 0x1c, 0x82, 0xb5, 0xa2, 0xc8, 0x14, 0x2a, 0x82, 0x85, + 0x20, 0x07, 0x64, 0x4b, 0x41, 0xc0, 0x05, 0x54, 0x95, 0xb4, 0x42, 0x91, 0xa0, 0x8a, 0x96, 0x96, + 0x03, 0x1c, 0xac, 0xad, 0xb3, 0x35, 0x2b, 0x92, 0xdd, 0xd5, 0x7a, 0x5d, 0x9a, 0x1b, 0x2f, 0xc0, + 0x8b, 0xf0, 0x34, 0x3c, 0x12, 0xda, 0x5d, 0x17, 0x5a, 0xd4, 0x00, 0xb7, 0x9d, 0xf1, 0x6f, 0x66, + 0xfe, 0x33, 0x9e, 0x81, 0x07, 0xa7, 0x63, 0x45, 0x56, 0x59, 0x29, 0x96, 0x79, 0x29, 0x14, 0xcd, + 0x89, 0x94, 0xb9, 0x12, 0x8d, 0xa6, 0x2a, 0x2f, 0x05, 0x3f, 0x61, 0x55, 0x26, 0x95, 0xd0, 0x02, + 0x6d, 0x9e, 0x73, 0x8a, 0x66, 0x44, 0xca, 0xcc, 0x31, 0x5b, 0xf7, 0x7f, 0x0b, 0x2f, 0xc5, 0x72, + 0x29, 0x78, 0xce, 0xa9, 0xce, 0xa5, 0x50, 0xda, 0x05, 0x6f, 0x3d, 0x5c, 0x4f, 0x71, 0xaa, 0x3f, + 0x0b, 0xf5, 0xc9, 0x81, 0xe9, 0x17, 0x0f, 0x82, 0x3d, 0xb1, 0x24, 0x8c, 0xa3, 0xa7, 0xd0, 0xd5, + 0x2b, 0x49, 0x13, 0x6f, 0xe8, 0x8d, 0x06, 0xe3, 0x34, 0xbb, 0xb2, 0x7e, 0xe6, 0xe0, 0xec, 0x70, + 0x25, 0x29, 0xb6, 0x3c, 0xba, 0x01, 0xbd, 0x53, 0xb2, 0x68, 0x68, 0xe2, 0x0f, 0xbd, 0x51, 0x88, + 0x9d, 0x91, 0x8e, 0xa0, 0x6b, 0x18, 0x14, 0x42, 0x6f, 0xb6, 0x20, 0x8c, 0xc7, 0xff, 0x99, 0x27, + 0xa6, 0x15, 0x3d, 0x8b, 0x3d, 0x04, 0xe7, 0x55, 0x63, 0x3f, 0xcd, 0xa0, 0x3b, 0x99, 0xee, 0x61, + 0x34, 0x00, 0x9f, 0x49, 0x5b, 0xbd, 0x8f, 0x7d, 0x26, 0xd1, 0x4d, 0x08, 0xa4, 0xa2, 0x27, 0xec, + 0xcc, 0x26, 0xbe, 0x86, 0x5b, 0x2b, 0xfd, 0x00, 0xbd, 0x57, 0x54, 0x4c, 0x67, 0xe8, 0x1e, 0xf4, + 0x4b, 0xd1, 0x70, 0xad, 0x56, 0x45, 0x29, 0xe6, 0x4e, 0x78, 0x88, 0xa3, 0xd6, 0x37, 0x11, 0x73, + 0x8a, 0x72, 0xe8, 0x96, 0x6c, 0xae, 0x12, 0x7f, 0xd8, 0x19, 0x45, 0xe3, 0xdb, 0x6b, 0x7a, 0x32, + 0xe5, 0xb1, 0x05, 0xd3, 0x1d, 0x08, 0x6d, 0xf2, 0xd7, 0xac, 0xd6, 0x68, 0x0c, 0x3d, 0x6a, 0x52, + 0x25, 0x9e, 0x0d, 0xbf, 0xb3, 0x26, 0xdc, 0x06, 0x60, 0x87, 0xa6, 0x5f, 0x3b, 0x10, 0x61, 0xd1, + 0x68, 0xc6, 0x2b, 0xdc, 0x2c, 0x28, 0x8a, 0xa1, 0xa3, 0x49, 0xd5, 0x6a, 0x33, 0x4f, 0xf4, 0x04, + 0x82, 0xb9, 0xed, 0xbd, 0x55, 0xb5, 0xfd, 0xc7, 0x49, 0xe3, 0x16, 0xfe, 0xd9, 0x4a, 0xe7, 0x1f, + 0x5b, 0x41, 0x3b, 0x00, 0x66, 0x23, 0x0a, 0x45, 0x78, 0x45, 0x93, 0xee, 0xd0, 0x1b, 0x45, 0xe3, + 0xe1, 0xc5, 0x30, 0xb7, 0x14, 0x19, 0xa7, 0x3a, 0x9b, 0x09, 0xa5, 0xb1, 0xe1, 0x70, 0x28, 0xcf, + 0x9f, 0x68, 0x1f, 0xfa, 0xed, 0xb2, 0x14, 0x0b, 0x56, 0xeb, 0xa4, 0x67, 0x53, 0xa4, 0x6b, 0x52, + 0x1c, 0x38, 0xd4, 0x0c, 0x0e, 0x47, 0xfc, 0x97, 0x81, 0x9e, 0x43, 0x54, 0x8b, 0x46, 0x95, 0xb4, + 0xb0, 0xfa, 0x83, 0xbf, 0xeb, 0x07, 0xc7, 0x4f, 0x4c, 0x17, 0xdb, 0x00, 0x4d, 0x4d, 0x55, 0x41, + 0x97, 0x84, 0x2d, 0x92, 0xff, 0x87, 0x9d, 0x51, 0x88, 0x43, 0xe3, 0xd9, 0x37, 0x0e, 0x74, 0x17, + 0x22, 0xc6, 0x8f, 0x45, 0xc3, 0xe7, 0x85, 0x19, 0xf3, 0x86, 0xfd, 0x0e, 0xad, 0xeb, 0x90, 0x54, + 0xe9, 0x77, 0x0f, 0x82, 0x89, 0xbd, 0x2b, 0x74, 0x04, 0xd7, 0xdd, 0x2c, 0x8b, 0x5a, 0x2b, 0xa2, + 0x69, 0xb5, 0x6a, 0x77, 0xfd, 0xd1, 0x3a, 0x31, 0xee, 0x1e, 0xdd, 0x8f, 0x78, 0xdb, 0xc6, 0xe0, + 0xc1, 0xfc, 0x92, 0x6d, 0xee, 0x46, 0x35, 0x0b, 0xda, 0xfe, 0xcd, 0x75, 0x77, 0x73, 0x61, 0x27, + 0xb0, 0xe5, 0xd3, 0x67, 0x30, 0xb8, 0x9c, 0x19, 0x6d, 0x40, 0x77, 0xb7, 0x9e, 0xd6, 0xee, 0x54, + 0x8e, 0x6a, 0x3a, 0x95, 0xb1, 0x87, 0x62, 0xe8, 0x4f, 0xe5, 0xf4, 0xe4, 0x40, 0xf0, 0x37, 0x44, + 0x97, 0x1f, 0x63, 0xff, 0xe5, 0x0b, 0xb8, 0x55, 0x8a, 0xe5, 0xd5, 0x75, 0x66, 0xde, 0xfb, 0xc0, + 0xbd, 0xbe, 0xf9, 0x9b, 0xef, 0xc6, 0x98, 0xac, 0xb2, 0x89, 0x21, 0x76, 0xa5, 0xb4, 0x12, 0xa8, + 0x3a, 0x0e, 0xec, 0xe5, 0x3f, 0xfe, 0x11, 0x00, 0x00, 0xff, 0xff, 0x5a, 0x12, 0x0e, 0x89, 0x89, + 0x04, 0x00, 0x00, } diff --git a/app/router/config.proto b/app/router/config.proto index 410cd9c3..51595fae 100644 --- a/app/router/config.proto +++ b/app/router/config.proto @@ -37,6 +37,15 @@ message CIDR { uint32 prefix = 2; } +message GeoIP { + string country_code = 1; + repeated CIDR cidr = 2; +} + +message GeoIPList { + repeated GeoIP entry = 1; +} + message RoutingRule { string tag = 1; repeated Domain domain = 2; From 198156b23694703d3236497f10bff6fbdbb829d7 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Thu, 2 Nov 2017 10:56:39 +0100 Subject: [PATCH 065/229] add geoip data --- tools/release/config/geoip.dat | Bin 0 -> 4272640 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100755 tools/release/config/geoip.dat diff --git a/tools/release/config/geoip.dat b/tools/release/config/geoip.dat new file mode 100755 index 0000000000000000000000000000000000000000..b83c937658b40fbd12cee4434430cba71599fb4e GIT binary patch literal 4272640 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 ul);Dm_^cac13>SGHPtC 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�V(6LQj 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

*Y$kXN-!$W)_W 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ΞUW4 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


$>mZ$LxurG-lctAeE}R2OY8d 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

7Jq@C2dFHIJ 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

2b4IX=j8LPmWj{F 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

auCDdG?wS<}rw3bkF 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

Xq$Wn8G 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

t1tP? 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%0DZGou6f;z@n z5Bp8D&^6K8fQjx5ndql}6a8F=ax}4i3F?>+c`>)SCOR-+qS-+co#;2wbtW3yEMTyW zy+(%;Z|rSB9do>~Ljoq66Ee^yx4ThP9UhwuvQ2bSw5=MqCR2dA2t-l!u|(XpZWL90i_5f4G)ISW*o~WJv^Cy%#655H5Hxyt(`dWbMC0RJ z9n%gFUPJL&Mmo|+XXp;3Z}FenIu^fQ=}>GFjJKx=#vUj9+tppL--HI+ME5%;YP|7C zpo6sbCw|YGXj8vtNjs^^S<^KpnslA5V_ri^lXNH^k{Vncv)`oswt+TFaZGfqk-ll9 zrMAgKjgfxhM%nVM;WyE?On)-cpQCB}q|il4v3HO1Zp(W2;+NXT_r8f=>U?c{GG7+1 zy|V=$hHo6?^2Xn1a}t;Koi>Iq0exS6k1tz&cLv$6@6J-b;Pm}f>h`bRTc<8>!+XBL zUWWIii>Y^v7~WIwY-FYy-W+P33BXmB)GB5HEE%^dRNk zOl*3eym*)CP5++9w>X=QI6NNj`fav**H3xzZYH+IQ>k~8we@=P!m10mw)Oe|7}pkf_XUZ5>&Y1s z!O2COjjbmaLoI=lfAg~S~*L$oU7XAlml<{ zYnzurA^PU;fNg=lcfl&8ZU}RG z)oSK9Q2K&rsfN|}5mIBUivuQliDRPr2k!j+AM()3=%HPP$;0J(HxR?+q4RC^caBr3 zx@@O5$+9(5(6KrMo#^OTJWO^?be?UZ3v~#;FPW*MV`=R}+eFVfnt7M))Fy{@Q?z!> z)v@^f%{I|FfX4l%M znRPwYp0~9d$M|{aPi%UIODDDui5mI{*PS?YDo^Z*Su(LF{;O2%{@W<(3@v1DX+1WP zBJj4CX|c3Cysc?kn0ciy{z1PF_0;-@KjBUOgL`Pfdo?~Na=6C9k`rOiw0Qh6&Hv+Q z*;3Q4lhx9Y!cJC}tC{j3bcz{gvTZ_FOYKh$O{XU3d`RsLZm0M<&C(LT@h8rq{|{yL B8>|2T literal 0 HcmV?d00001 From c30aa63df7eb28904e862ec6c90a8207e3ee699e Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Thu, 2 Nov 2017 21:33:47 +0100 Subject: [PATCH 066/229] update config file using new syntax --- tools/release/config/vpoint_socks_vmess.json | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/tools/release/config/vpoint_socks_vmess.json b/tools/release/config/vpoint_socks_vmess.json index 51863a67..d8a09ae6 100644 --- a/tools/release/config/vpoint_socks_vmess.json +++ b/tools/release/config/vpoint_socks_vmess.json @@ -84,7 +84,8 @@ "outboundTag": "direct" }, { - "type": "chinasites", + "type": "field", + "domain": ["geosite:cn"], "outboundTag": "direct" }, { @@ -104,13 +105,10 @@ "203.0.113.0/24", "::1/128", "fc00::/7", - "fe80::/10" + "fe80::/10", + "geoip:cn" ], "outboundTag": "direct" - }, - { - "type": "chinaip", - "outboundTag": "direct" } ] } From f39b9add6329047186efa2f5271e844b7a553b84 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Thu, 2 Nov 2017 22:03:33 +0100 Subject: [PATCH 067/229] Update version --- core.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core.go b/core.go index 6693d16a..567e2634 100644 --- a/core.go +++ b/core.go @@ -18,7 +18,7 @@ import ( ) var ( - version = "2.46" + version = "2.47" build = "Custom" codename = "One for all" intro = "An unified platform for anti-censorship." From 10712b3235098f5fdb1e95eb247f6a21215c7e03 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 3 Nov 2017 13:03:51 +0100 Subject: [PATCH 068/229] fix http port parsing --- proxy/http/server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proxy/http/server.go b/proxy/http/server.go index e5a0a10a..6ed20e60 100644 --- a/proxy/http/server.go +++ b/proxy/http/server.go @@ -54,7 +54,7 @@ func parseHost(rawHost string, defaultPort net.Port) (net.Destination, error) { } else { return net.Destination{}, err } - } else { + } else if len(rawPort) > 0 { intPort, err := strconv.Atoi(rawPort) if err != nil { return net.Destination{}, err From 2f5d50164398ade49859cc44d45654f12c468608 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 3 Nov 2017 13:19:48 +0100 Subject: [PATCH 069/229] fix length calculation in bufferToBytesReader.WriteTo --- common/buf/reader.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/buf/reader.go b/common/buf/reader.go index fce13c9b..cade2a78 100644 --- a/common/buf/reader.go +++ b/common/buf/reader.go @@ -73,10 +73,10 @@ func (r *bufferToBytesReader) writeToInternal(writer io.Writer) (int64, error) { mbWriter := NewWriter(writer) totalBytes := int64(0) if r.leftOver != nil { + totalBytes += int64(r.leftOver.Len()) if err := mbWriter.Write(r.leftOver); err != nil { return 0, err } - totalBytes += int64(r.leftOver.Len()) } for { From a083e1fcd612593eea3f3362417ca4220a86218f Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 3 Nov 2017 14:44:24 +0100 Subject: [PATCH 070/229] use go 1.9.2 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 8a488682..df4b91fa 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,7 @@ sudo: required language: go go: -- 1.9 +- 1.9.2 go_import_path: v2ray.com/core git: depth: 5 From 14052351d6b6494e691521c5697bd01f1e50c286 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 3 Nov 2017 14:45:23 +0100 Subject: [PATCH 071/229] build with golang 1.9.2 --- tools/release/release-ci.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/release/release-ci.sh b/tools/release/release-ci.sh index cd4d46e9..0dadcb3e 100755 --- a/tools/release/release-ci.sh +++ b/tools/release/release-ci.sh @@ -25,7 +25,7 @@ echo ${SIGN_KEY_PASS} | gpg --passphrase-fd 0 --batch --import /v2ray/build/sign curl -L -o /v2ray/build/releases https://api.github.com/repos/v2ray/v2ray-core/releases GO_INSTALL=golang.tar.gz -curl -L -o ${GO_INSTALL} https://storage.googleapis.com/golang/go1.9.linux-amd64.tar.gz +curl -L -o ${GO_INSTALL} https://storage.googleapis.com/golang/go1.9.2.linux-amd64.tar.gz tar -C /usr/local -xzf ${GO_INSTALL} export PATH=$PATH:/usr/local/go/bin From 55f821be20187dc78979ff617afb2ce4006673ad Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 3 Nov 2017 17:11:21 +0100 Subject: [PATCH 072/229] update release ci --- tools/release/release-ci.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/release/release-ci.sh b/tools/release/release-ci.sh index 0dadcb3e..38c9ffd8 100755 --- a/tools/release/release-ci.sh +++ b/tools/release/release-ci.sh @@ -118,6 +118,8 @@ git clone "https://github.com/v2ray/install.git" ${INSTALL_DIR} #echo ${RELEASE_TAG} > ${INSTALL_DIR}/releases/latest.txt cp $GOPATH/bin/v2ray-${RELEASE_TAG}-linux-64/v2ray ${INSTALL_DIR}/docker/official/ +cp $GOPATH/bin/v2ray-${RELEASE_TAG}-linux-64/v2ctl ${INSTALL_DIR}/docker/official/ +cp $GOPATH/bin/v2ray-${RELEASE_TAG}-linux-64/geoip.dat ${INSTALL_DIR}/docker/official/ pushd ${INSTALL_DIR} git config user.name "V2Ray Auto Build" From 1413bb2944898ec6dabb7425a9698f9713556601 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 3 Nov 2017 22:40:12 +0100 Subject: [PATCH 073/229] update --- release/install-release.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release/install-release.sh b/release/install-release.sh index f5df6c97..bcf6397c 100755 --- a/release/install-release.sh +++ b/release/install-release.sh @@ -73,7 +73,7 @@ sysAcrh(){ VDIS="32" elif [[ "$ARCH" == *"armv7"* ]] || [[ "$ARCH" == "armv6l" ]]; then VDIS="arm" - elif [[ "$ARCH" == *"armv8"* ]]; then + elif [[ "$ARCH" == *"armv8"* ]] || [[ "$ARCH" == "aarch64" ]]; then VDIS="arm64" fi return 0 From b0a132596f0c6adbb906b6b13fe2d8b45179d193 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 3 Nov 2017 23:42:33 +0100 Subject: [PATCH 074/229] install more files --- release/install-release.sh | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/release/install-release.sh b/release/install-release.sh index bcf6397c..ae7f9346 100755 --- a/release/install-release.sh +++ b/release/install-release.sh @@ -191,15 +191,27 @@ startV2ray(){ return 0 } -installV2Ray(){ - # Install V2Ray binary to /usr/bin/v2ray - mkdir -p /usr/bin/v2ray - ERROR=`cp "/tmp/v2ray/v2ray-${NEW_VER}-linux-${VDIS}/v2ray" "/usr/bin/v2ray/v2ray"` +copyFile() { + NAME=$1 + ERROR=`cp "/tmp/v2ray/v2ray-${NEW_VER}-linux-${VDIS}/${NAME}" "/usr/bin/v2ray/${NAME}"` if [[ $? -ne 0 ]]; then colorEcho ${YELLOW} "${ERROR}" exit fi - chmod +x "/usr/bin/v2ray/v2ray" +} + +makeExecutable() { + chmod +x "/usr/bin/v2ray/$1" +} + +installV2Ray(){ + # Install V2Ray binary to /usr/bin/v2ray + mkdir -p /usr/bin/v2ray + copyFile v2ray + makeExecutable v2ray + copyFile v2ctl + makeExecutable v2ctl + copyFile geoip.dat # Install V2Ray server config to /etc/v2ray mkdir -p /etc/v2ray From 823a3bf795a8c1b519ffc3be38c60c08c223e50b Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sat, 4 Nov 2017 00:22:19 +0100 Subject: [PATCH 075/229] upload docker files to gcs --- tools/release/release-ci.sh | 22 +++------------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/tools/release/release-ci.sh b/tools/release/release-ci.sh index 38c9ffd8..1d37bb0a 100755 --- a/tools/release/release-ci.sh +++ b/tools/release/release-ci.sh @@ -109,25 +109,9 @@ if [[ "${PRERELEASE}" == "false" ]]; then INSTALL_DIR=/v2ray/src/github.com/v2ray/install -git clone "https://github.com/v2ray/install.git" ${INSTALL_DIR} - -#RELEASE_DIR=${INSTALL_DIR}/releases/${RELEASE_TAG} -#mkdir -p ${RELEASE_DIR}/ -#cp $GOPATH/bin/metadata.txt ${RELEASE_DIR}/ -#cp $GOPATH/bin/v2ray-*.zip ${RELEASE_DIR}/ -#echo ${RELEASE_TAG} > ${INSTALL_DIR}/releases/latest.txt - -cp $GOPATH/bin/v2ray-${RELEASE_TAG}-linux-64/v2ray ${INSTALL_DIR}/docker/official/ -cp $GOPATH/bin/v2ray-${RELEASE_TAG}-linux-64/v2ctl ${INSTALL_DIR}/docker/official/ -cp $GOPATH/bin/v2ray-${RELEASE_TAG}-linux-64/geoip.dat ${INSTALL_DIR}/docker/official/ - -pushd ${INSTALL_DIR} -git config user.name "V2Ray Auto Build" -git config user.email "admin@v2ray.com" -git add -A -git commit -m "Update for ${RELEASE_TAG}" -git push "https://${GITHUB_TOKEN}@github.com/v2ray/install.git" master -popd +gsutil cp $GOPATH/bin/v2ray-${RELEASE_TAG}-linux-64/v2ray gs://v2ray-docker/ +gsutil cp $GOPATH/bin/v2ray-${RELEASE_TAG}-linux-64/v2ctl gs://v2ray-docker/ +gsutil cp $GOPATH/bin/v2ray-${RELEASE_TAG}-linux-64/geoip.dat gs://v2ray-docker/ DOCKER_HUB_API=https://registry.hub.docker.com/u/v2ray/official/trigger/${DOCKER_HUB_KEY}/ curl -H "Content-Type: application/json" --data '{"build": true}' -X POST "${DOCKER_HUB_API}" From 1b1bdc10af1228daa6a7f97a59919062d307499e Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sat, 4 Nov 2017 00:22:42 +0100 Subject: [PATCH 076/229] remove unused lines --- tools/release/release-ci.sh | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/tools/release/release-ci.sh b/tools/release/release-ci.sh index 1d37bb0a..08eb78e8 100755 --- a/tools/release/release-ci.sh +++ b/tools/release/release-ci.sh @@ -89,26 +89,9 @@ upload $GOPATH/bin/v2ray-freebsd-32.zip upload $GOPATH/bin/v2ray-openbsd-64.zip upload $GOPATH/bin/v2ray-openbsd-32.zip upload $GOPATH/bin/metadata.txt -#upload $GOPATH/bin/vencrypted-macos.7z -#upload $GOPATH/bin/vencrypted-windows-64.7z -#upload $GOPATH/bin/vencrypted-windows-32.7z -#upload $GOPATH/bin/vencrypted-linux-64.7z -#upload $GOPATH/bin/vencrypted-linux-32.7z -#upload $GOPATH/bin/vencrypted-linux-arm.7z -#upload $GOPATH/bin/vencrypted-linux-arm64.7z -#upload $GOPATH/bin/vencrypted-linux-mips64.7z -#upload $GOPATH/bin/vencrypted-linux-mips64le.7z -#upload $GOPATH/bin/vencrypted-linux-mips.7z -#upload $GOPATH/bin/vencrypted-linux-mipsle.7z -#upload $GOPATH/bin/vencrypted-freebsd-64.7z -#upload $GOPATH/bin/vencrypted-freebsd-32.7z -#upload $GOPATH/bin/vencrypted-openbsd-64.7z -#upload $GOPATH/bin/vencrypted-openbsd-32.7z if [[ "${PRERELEASE}" == "false" ]]; then -INSTALL_DIR=/v2ray/src/github.com/v2ray/install - gsutil cp $GOPATH/bin/v2ray-${RELEASE_TAG}-linux-64/v2ray gs://v2ray-docker/ gsutil cp $GOPATH/bin/v2ray-${RELEASE_TAG}-linux-64/v2ctl gs://v2ray-docker/ gsutil cp $GOPATH/bin/v2ray-${RELEASE_TAG}-linux-64/geoip.dat gs://v2ray-docker/ From ba16987a07a1ecae330d5e7bcc19f8f613e9c070 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sat, 4 Nov 2017 00:35:05 +0100 Subject: [PATCH 077/229] check request.Host instead of request.URL.Host. fix #681 --- proxy/http/server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proxy/http/server.go b/proxy/http/server.go index 6ed20e60..17ae31f4 100644 --- a/proxy/http/server.go +++ b/proxy/http/server.go @@ -217,7 +217,7 @@ func StripHopByHopHeaders(header http.Header) { var errWaitAnother = newError("keep alive") func (s *Server) handlePlainHTTP(ctx context.Context, request *http.Request, reader io.Reader, writer io.Writer, dest net.Destination, dispatcher dispatcher.Interface) error { - if len(request.URL.Host) <= 0 { + if len(request.Host) <= 0 { response := &http.Response{ Status: "Bad Request", StatusCode: 400, From 4412d73b282c5159fd1ed4298041a3d00be5dbc7 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sat, 4 Nov 2017 01:33:28 +0100 Subject: [PATCH 078/229] get rid off ioutil --- common/buf/multi_buffer.go | 37 ++++++++++++++++++++++++++++++++++++- loader.go | 10 +++++++--- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/common/buf/multi_buffer.go b/common/buf/multi_buffer.go index 82f1f030..f7422808 100644 --- a/common/buf/multi_buffer.go +++ b/common/buf/multi_buffer.go @@ -1,6 +1,11 @@ package buf -import "net" +import ( + "io" + "net" + + "v2ray.com/core/common/errors" +) type MultiBufferWriter interface { WriteMultiBuffer(MultiBuffer) error @@ -10,6 +15,36 @@ type MultiBufferReader interface { ReadMultiBuffer() (MultiBuffer, error) } +func ReadAllToMultiBuffer(reader io.Reader) (MultiBuffer, error) { + mb := NewMultiBuffer() + + for { + b := New() + err := b.AppendSupplier(ReadFrom(reader)) + if !b.IsEmpty() { + mb.Append(b) + } + if err != nil { + if errors.Cause(err) == io.EOF { + return mb, nil + } + mb.Release() + return nil, err + } + } +} + +func ReadAllToBytes(reader io.Reader) ([]byte, error) { + mb, err := ReadAllToMultiBuffer(reader) + if err != nil { + return nil, err + } + b := make([]byte, mb.Len()) + mb.Read(b) + mb.Release() + return b, nil +} + // MultiBuffer is a list of Buffers. The order of Buffer matters. type MultiBuffer []*Buffer diff --git a/loader.go b/loader.go index 07ef279c..40ebb6fc 100644 --- a/loader.go +++ b/loader.go @@ -2,10 +2,11 @@ package core import ( "io" - "io/ioutil" + + "v2ray.com/core/common" + "v2ray.com/core/common/buf" "github.com/golang/protobuf/proto" - "v2ray.com/core/common" ) // ConfigLoader is an utility to load V2Ray config from external source. @@ -30,7 +31,10 @@ func LoadConfig(format ConfigFormat, input io.Reader) (*Config, error) { func loadProtobufConfig(input io.Reader) (*Config, error) { config := new(Config) - data, _ := ioutil.ReadAll(input) + data, err := buf.ReadAllToBytes(input) + if err != nil { + return nil, err + } if err := proto.Unmarshal(data, config); err != nil { return nil, err } From 4b240eb68311f78b8700b104751630e79b73458c Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sat, 4 Nov 2017 01:33:35 +0100 Subject: [PATCH 079/229] DiscardBytes --- common/buf/writer.go | 32 ++++++++++++++++++++++++++++++-- common/buf/writer_test.go | 25 +++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/common/buf/writer.go b/common/buf/writer.go index 084598e7..3944382a 100644 --- a/common/buf/writer.go +++ b/common/buf/writer.go @@ -1,6 +1,10 @@ package buf -import "io" +import ( + "io" + + "v2ray.com/core/common/errors" +) // BufferToBytesWriter is a Writer that writes alloc.Buffer into underlying writer. type BufferToBytesWriter struct { @@ -109,6 +113,30 @@ func (noOpWriter) Write(b MultiBuffer) error { return nil } +type noOpBytesWriter struct{} + +func (noOpBytesWriter) Write(b []byte) (int, error) { + return len(b), nil +} + +func (noOpBytesWriter) ReadFrom(reader io.Reader) (int64, error) { + b := New() + defer b.Release() + + totalBytes := int64(0) + for { + err := b.Reset(ReadFrom(reader)) + totalBytes += int64(b.Len()) + if err != nil { + if errors.Cause(err) == io.EOF { + return totalBytes, nil + } + return totalBytes, err + } + } +} + var ( - Discard Writer = noOpWriter{} + Discard Writer = noOpWriter{} + DiscardBytes io.Writer = noOpBytesWriter{} ) diff --git a/common/buf/writer_test.go b/common/buf/writer_test.go index 69198f31..0dfef9b0 100644 --- a/common/buf/writer_test.go +++ b/common/buf/writer_test.go @@ -9,6 +9,7 @@ import ( "context" "io" + "v2ray.com/core/common" . "v2ray.com/core/common/buf" "v2ray.com/core/transport/ray" . "v2ray.com/ext/assert" @@ -43,3 +44,27 @@ func TestBytesWriterReadFrom(t *testing.T) { assert(mb.Len(), Equals, 8192) assert(len(mb), Equals, 4) } + +func TestDiscardBytes(t *testing.T) { + assert := With(t) + + b := New() + common.Must(b.Reset(ReadFrom(rand.Reader))) + + nBytes, err := io.Copy(DiscardBytes, b) + assert(nBytes, Equals, int64(Size)) + assert(err, IsNil) +} + +func TestDiscardBytesMultiBuffer(t *testing.T) { + assert := With(t) + + const size = 10240*1024 + 1 + buffer := bytes.NewBuffer(make([]byte, 0, size)) + common.Must2(buffer.ReadFrom(io.LimitReader(rand.Reader, size))) + + r := NewReader(buffer) + nBytes, err := io.Copy(DiscardBytes, ToBytesReader(r)) + assert(nBytes, Equals, int64(size)) + assert(err, IsNil) +} From 25a1f1d4502b3f43fe31ed823da85ecf9b57bb4b Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sat, 4 Nov 2017 01:45:00 +0100 Subject: [PATCH 080/229] fix typo --- release/install-release.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/release/install-release.sh b/release/install-release.sh index ae7f9346..5ead29c5 100755 --- a/release/install-release.sh +++ b/release/install-release.sh @@ -67,7 +67,7 @@ colorEcho(){ echo -e "\033[${COLOR}${@:2}\033[0m" } -sysAcrh(){ +sysArch(){ ARCH=$(uname -m) if [[ "$ARCH" == "i686" ]] || [[ "$ARCH" == "i386" ]]; then VDIS="32" @@ -320,7 +320,7 @@ main(){ [[ "$CHECK" == "1" ]] && checkUpdate [[ "$REMOVE" == "1" ]] && remove - sysAcrh + sysArch # extract local file if [[ $LOCAL_INSTALL -eq 1 ]]; then echo "Install V2Ray via local file" From fde421ac58807741636655ddc579ab16a2e0bf50 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sat, 4 Nov 2017 09:47:41 +0100 Subject: [PATCH 081/229] Revert "check request.Host instead of request.URL.Host. fix #681" This reverts commit ba16987a07a1ecae330d5e7bcc19f8f613e9c070. --- proxy/http/server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proxy/http/server.go b/proxy/http/server.go index 17ae31f4..6ed20e60 100644 --- a/proxy/http/server.go +++ b/proxy/http/server.go @@ -217,7 +217,7 @@ func StripHopByHopHeaders(header http.Header) { var errWaitAnother = newError("keep alive") func (s *Server) handlePlainHTTP(ctx context.Context, request *http.Request, reader io.Reader, writer io.Writer, dest net.Destination, dispatcher dispatcher.Interface) error { - if len(request.Host) <= 0 { + if len(request.URL.Host) <= 0 { response := &http.Response{ Status: "Bad Request", StatusCode: 400, From cec45a416c40f3cae844f695ea9b39eeba7ec9f6 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sat, 4 Nov 2017 20:50:17 +0100 Subject: [PATCH 082/229] allow fast close on UDP session. fix #682 --- proxy/socks/server.go | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/proxy/socks/server.go b/proxy/socks/server.go index 3bef8f5c..8bb2eeda 100644 --- a/proxy/socks/server.go +++ b/proxy/socks/server.go @@ -90,19 +90,17 @@ func (s *Server) processTCP(ctx context.Context, conn internet.Connection, dispa } if request.Command == protocol.RequestCommandUDP { - return s.handleUDP() + return s.handleUDP(conn) } return nil } -func (*Server) handleUDP() error { - // The TCP connection closes after v method returns. We need to wait until +func (*Server) handleUDP(c net.Conn) error { + // The TCP connection closes after this method returns. We need to wait until // the client closes it. - // TODO: get notified from UDP part - time.Sleep(5 * time.Minute) - - return nil + _, err := io.Copy(buf.DiscardBytes, c) + return err } func (v *Server) transport(ctx context.Context, reader io.Reader, writer io.Writer, dest net.Destination, dispatcher dispatcher.Interface) error { From 1d2c62406257d1983a1664a5461e271157d3a833 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sat, 4 Nov 2017 21:33:09 +0100 Subject: [PATCH 083/229] get asset location --- common/platform/platform.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/common/platform/platform.go b/common/platform/platform.go index 2327ad66..85126b70 100644 --- a/common/platform/platform.go +++ b/common/platform/platform.go @@ -2,6 +2,7 @@ package platform import ( "os" + "path/filepath" "strconv" "strings" ) @@ -40,3 +41,19 @@ func (f EnvFlag) GetValueAsInt(defaultValue int) int { func NormalizeEnvName(name string) string { return strings.Replace(strings.ToUpper(strings.TrimSpace(name)), ".", "_", -1) } + +var assetPath = "/" + +func init() { + defAssetLocation, err := os.Executable() + if err == nil { + defAssetLocation = filepath.Dir(defAssetLocation) + assetPath = (EnvFlag{ + Name: "v2ray.location.asset", + }).GetValue(defAssetLocation) + } +} + +func GetAssetLocation(file string) string { + return filepath.Join(assetPath, file) +} From 01cfcbeb30c8b7ffda228d8f9d40b5eafcf48df1 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 5 Nov 2017 01:17:52 +0100 Subject: [PATCH 084/229] update README --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 29ba7397..56e7a53b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Project V2Ray +# Project V [![Build Status][1]][2] [![codecov.io][3]][4] [![Go Report][5]][6] [![GoDoc][7]][8] [![codebeat][9]][10] @@ -13,11 +13,11 @@ [9]: https://codebeat.co/badges/f2354ca8-3e24-463d-a2e3-159af73b2477 "Codebeat badge" [10]: https://codebeat.co/projects/github-com-v2ray-v2ray-core-master "Codebeat" -V2Ray 是一个模块化的代理软件包,它的目标是提供常用的代理软件模块,简化网络代理软件的开发。 +V 是一个模块化的代理软件包,它的目标是提供常用的代理软件模块,简化网络代理软件的开发。 [官方网站](https://www.v2ray.com/) -V2Ray provides building blocks for network proxy development. Read our [Wiki](https://www.v2ray.com/en/index.html) for more information. +V provides building blocks for network proxy development. Read our [Wiki](https://www.v2ray.com/en/index.html) for more information. ## License [The MIT License (MIT)](https://raw.githubusercontent.com/v2ray/v2ray-core/master/LICENSE) From 541924dc88caf780e14cf7960ee163c7c39438a6 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 5 Nov 2017 10:37:23 +0100 Subject: [PATCH 085/229] fix cidr parsing for non-normalized ips --- common/net/ipnet.go | 1 + common/net/ipnet_test.go | 2 ++ 2 files changed, 3 insertions(+) diff --git a/common/net/ipnet.go b/common/net/ipnet.go index 530d3b1b..c30f2e88 100644 --- a/common/net/ipnet.go +++ b/common/net/ipnet.go @@ -44,6 +44,7 @@ func (n *IPNetTable) Add(ipNet *net.IPNet) { func (n *IPNetTable) AddIP(ip []byte, mask byte) { k := ipToUint32(ip) + k = (k >> (32 - mask)) << (32 - mask) // normalize ip existing, found := n.cache[k] if !found || existing > mask { n.cache[k] = mask diff --git a/common/net/ipnet_test.go b/common/net/ipnet_test.go index 132dca9b..5c22c833 100644 --- a/common/net/ipnet_test.go +++ b/common/net/ipnet_test.go @@ -32,6 +32,7 @@ func TestIPNet(t *testing.T) { ipNet.Add(parseCIDR(("198.51.100.0/24"))) ipNet.Add(parseCIDR(("203.0.113.0/24"))) ipNet.Add(parseCIDR(("8.8.8.8/32"))) + ipNet.AddIP(net.ParseIP("91.108.4.0"), 16) assert(ipNet.Contains(ParseIP("192.168.1.1")), IsTrue) assert(ipNet.Contains(ParseIP("192.0.0.0")), IsTrue) assert(ipNet.Contains(ParseIP("192.0.1.0")), IsFalse) @@ -40,4 +41,5 @@ func TestIPNet(t *testing.T) { assert(ipNet.Contains(ParseIP("8.8.8.7")), IsFalse) assert(ipNet.Contains(ParseIP("8.8.8.8")), IsTrue) assert(ipNet.Contains(ParseIP("2001:cdba::3257:9652")), IsFalse) + assert(ipNet.Contains(ParseIP("91.108.255.254")), IsTrue) } From eb8f11c512e167029fce1d13416f390a5b3ca838 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 5 Nov 2017 17:00:22 +0100 Subject: [PATCH 086/229] remove chinaips --- tools/geoip/geoip.generated.go | 3 -- tools/geoip/geoip.go | 3 -- tools/geoip/geoip.pb.go | 55 -------------------- tools/geoip/geoip.proto | 13 ----- tools/geoip/geoip_gen.go | 92 ---------------------------------- 5 files changed, 166 deletions(-) delete mode 100644 tools/geoip/geoip.generated.go delete mode 100644 tools/geoip/geoip.go delete mode 100644 tools/geoip/geoip.pb.go delete mode 100644 tools/geoip/geoip.proto delete mode 100644 tools/geoip/geoip_gen.go diff --git a/tools/geoip/geoip.generated.go b/tools/geoip/geoip.generated.go deleted file mode 100644 index 689a9291..00000000 --- a/tools/geoip/geoip.generated.go +++ /dev/null @@ -1,3 +0,0 @@ -package geoip - -var ChinaIPs = []byte{10, 8, 10, 4, 1, 0, 1, 0, 16, 24, 10, 8, 10, 4, 1, 0, 2, 0, 16, 23, 10, 8, 10, 4, 1, 0, 8, 0, 16, 21, 10, 8, 10, 4, 1, 0, 32, 0, 16, 19, 10, 8, 10, 4, 1, 1, 0, 0, 16, 24, 10, 8, 10, 4, 1, 1, 2, 0, 16, 23, 10, 8, 10, 4, 1, 1, 4, 0, 16, 22, 10, 8, 10, 4, 1, 1, 8, 0, 16, 24, 10, 8, 10, 4, 1, 1, 9, 0, 16, 24, 10, 8, 10, 4, 1, 1, 10, 0, 16, 23, 10, 8, 10, 4, 1, 1, 12, 0, 16, 22, 10, 8, 10, 4, 1, 1, 16, 0, 16, 20, 10, 8, 10, 4, 1, 1, 32, 0, 16, 19, 10, 8, 10, 4, 1, 2, 0, 0, 16, 23, 10, 8, 10, 4, 1, 2, 2, 0, 16, 24, 10, 8, 10, 4, 1, 2, 4, 0, 16, 24, 10, 8, 10, 4, 1, 2, 5, 0, 16, 24, 10, 8, 10, 4, 1, 2, 6, 0, 16, 23, 10, 8, 10, 4, 1, 2, 8, 0, 16, 24, 10, 8, 10, 4, 1, 2, 9, 0, 16, 24, 10, 8, 10, 4, 1, 2, 10, 0, 16, 23, 10, 8, 10, 4, 1, 2, 12, 0, 16, 22, 10, 8, 10, 4, 1, 2, 16, 0, 16, 20, 10, 8, 10, 4, 1, 2, 32, 0, 16, 19, 10, 8, 10, 4, 1, 2, 64, 0, 16, 18, 10, 8, 10, 4, 1, 3, 0, 0, 16, 16, 10, 8, 10, 4, 1, 4, 1, 0, 16, 24, 10, 8, 10, 4, 1, 4, 2, 0, 16, 23, 10, 8, 10, 4, 1, 4, 4, 0, 16, 24, 10, 8, 10, 4, 1, 4, 5, 0, 16, 24, 10, 8, 10, 4, 1, 4, 6, 0, 16, 23, 10, 8, 10, 4, 1, 4, 8, 0, 16, 21, 10, 8, 10, 4, 1, 4, 16, 0, 16, 20, 10, 8, 10, 4, 1, 4, 32, 0, 16, 19, 10, 8, 10, 4, 1, 4, 64, 0, 16, 18, 10, 8, 10, 4, 1, 8, 0, 0, 16, 16, 10, 8, 10, 4, 1, 10, 0, 0, 16, 21, 10, 8, 10, 4, 1, 10, 8, 0, 16, 23, 10, 8, 10, 4, 1, 10, 11, 0, 16, 24, 10, 8, 10, 4, 1, 10, 12, 0, 16, 22, 10, 8, 10, 4, 1, 10, 16, 0, 16, 20, 10, 8, 10, 4, 1, 10, 32, 0, 16, 19, 10, 8, 10, 4, 1, 10, 64, 0, 16, 18, 10, 8, 10, 4, 1, 12, 0, 0, 16, 14, 10, 8, 10, 4, 1, 24, 0, 0, 16, 13, 10, 8, 10, 4, 1, 45, 0, 0, 16, 16, 10, 8, 10, 4, 1, 48, 0, 0, 16, 15, 10, 8, 10, 4, 1, 50, 0, 0, 16, 16, 10, 8, 10, 4, 1, 51, 0, 0, 16, 16, 10, 8, 10, 4, 1, 56, 0, 0, 16, 13, 10, 8, 10, 4, 1, 68, 0, 0, 16, 14, 10, 8, 10, 4, 1, 80, 0, 0, 16, 13, 10, 8, 10, 4, 1, 88, 0, 0, 16, 14, 10, 8, 10, 4, 1, 92, 0, 0, 16, 15, 10, 8, 10, 4, 1, 94, 0, 0, 16, 15, 10, 8, 10, 4, 1, 116, 0, 0, 16, 15, 10, 8, 10, 4, 1, 118, 0, 0, 16, 16, 10, 8, 10, 4, 1, 119, 0, 0, 16, 17, 10, 8, 10, 4, 1, 119, 128, 0, 16, 17, 10, 8, 10, 4, 1, 180, 0, 0, 16, 14, 10, 8, 10, 4, 1, 184, 0, 0, 16, 15, 10, 8, 10, 4, 1, 188, 0, 0, 16, 14, 10, 8, 10, 4, 1, 192, 0, 0, 16, 13, 10, 8, 10, 4, 1, 202, 0, 0, 16, 15, 10, 8, 10, 4, 1, 204, 0, 0, 16, 14, 10, 8, 10, 4, 14, 0, 0, 0, 16, 21, 10, 8, 10, 4, 14, 0, 12, 0, 16, 22, 10, 8, 10, 4, 14, 1, 0, 0, 16, 22, 10, 8, 10, 4, 14, 1, 24, 0, 16, 22, 10, 8, 10, 4, 14, 1, 96, 0, 16, 22, 10, 8, 10, 4, 14, 1, 108, 0, 16, 22, 10, 8, 10, 4, 14, 16, 0, 0, 16, 12, 10, 8, 10, 4, 14, 102, 128, 0, 16, 22, 10, 8, 10, 4, 14, 102, 156, 0, 16, 22, 10, 8, 10, 4, 14, 102, 180, 0, 16, 22, 10, 8, 10, 4, 14, 103, 0, 0, 16, 16, 10, 8, 10, 4, 14, 104, 0, 0, 16, 13, 10, 8, 10, 4, 14, 112, 0, 0, 16, 12, 10, 8, 10, 4, 14, 130, 0, 0, 16, 15, 10, 8, 10, 4, 14, 134, 0, 0, 16, 15, 10, 8, 10, 4, 14, 144, 0, 0, 16, 12, 10, 8, 10, 4, 14, 192, 4, 0, 16, 22, 10, 8, 10, 4, 14, 192, 60, 0, 16, 22, 10, 8, 10, 4, 14, 192, 76, 0, 16, 22, 10, 8, 10, 4, 14, 196, 0, 0, 16, 15, 10, 8, 10, 4, 14, 204, 0, 0, 16, 15, 10, 8, 10, 4, 14, 208, 0, 0, 16, 12, 10, 8, 10, 4, 27, 0, 128, 0, 16, 22, 10, 8, 10, 4, 27, 0, 132, 0, 16, 22, 10, 8, 10, 4, 27, 0, 160, 0, 16, 22, 10, 8, 10, 4, 27, 0, 164, 0, 16, 22, 10, 8, 10, 4, 27, 0, 188, 0, 16, 22, 10, 8, 10, 4, 27, 0, 204, 0, 16, 22, 10, 8, 10, 4, 27, 0, 208, 0, 16, 22, 10, 8, 10, 4, 27, 0, 212, 0, 16, 22, 10, 8, 10, 4, 27, 8, 0, 0, 16, 13, 10, 8, 10, 4, 27, 16, 0, 0, 16, 12, 10, 8, 10, 4, 27, 34, 232, 0, 16, 21, 10, 8, 10, 4, 27, 36, 0, 0, 16, 14, 10, 8, 10, 4, 27, 40, 0, 0, 16, 13, 10, 8, 10, 4, 27, 50, 40, 0, 16, 21, 10, 8, 10, 4, 27, 50, 128, 0, 16, 17, 10, 8, 10, 4, 27, 54, 72, 0, 16, 21, 10, 8, 10, 4, 27, 54, 152, 0, 16, 21, 10, 8, 10, 4, 27, 54, 192, 0, 16, 18, 10, 8, 10, 4, 27, 98, 208, 0, 16, 20, 10, 8, 10, 4, 27, 98, 224, 0, 16, 19, 10, 8, 10, 4, 27, 99, 128, 0, 16, 17, 10, 8, 10, 4, 27, 103, 0, 0, 16, 16, 10, 8, 10, 4, 27, 106, 128, 0, 16, 18, 10, 8, 10, 4, 27, 106, 204, 0, 16, 22, 10, 8, 10, 4, 27, 109, 32, 0, 16, 19, 10, 8, 10, 4, 27, 109, 124, 0, 16, 22, 10, 8, 10, 4, 27, 112, 0, 0, 16, 18, 10, 8, 10, 4, 27, 112, 80, 0, 16, 20, 10, 8, 10, 4, 27, 112, 112, 0, 16, 22, 10, 8, 10, 4, 27, 112, 116, 0, 16, 22, 10, 8, 10, 4, 27, 113, 128, 0, 16, 18, 10, 8, 10, 4, 27, 115, 0, 0, 16, 17, 10, 8, 10, 4, 27, 116, 44, 0, 16, 22, 10, 8, 10, 4, 27, 121, 72, 0, 16, 21, 10, 8, 10, 4, 27, 121, 120, 0, 16, 21, 10, 8, 10, 4, 27, 123, 232, 0, 16, 22, 10, 8, 10, 4, 27, 128, 0, 0, 16, 15, 10, 8, 10, 4, 27, 131, 220, 0, 16, 22, 10, 8, 10, 4, 27, 144, 0, 0, 16, 16, 10, 8, 10, 4, 27, 148, 0, 0, 16, 14, 10, 8, 10, 4, 27, 152, 0, 0, 16, 13, 10, 8, 10, 4, 27, 184, 0, 0, 16, 13, 10, 8, 10, 4, 27, 192, 0, 0, 16, 11, 10, 8, 10, 4, 27, 224, 0, 0, 16, 14, 10, 8, 10, 4, 36, 0, 0, 0, 16, 22, 10, 8, 10, 4, 36, 0, 8, 0, 16, 21, 10, 8, 10, 4, 36, 0, 16, 0, 16, 20, 10, 8, 10, 4, 36, 0, 32, 0, 16, 19, 10, 8, 10, 4, 36, 0, 64, 0, 16, 18, 10, 8, 10, 4, 36, 0, 128, 0, 16, 17, 10, 8, 10, 4, 36, 1, 0, 0, 16, 16, 10, 8, 10, 4, 36, 4, 0, 0, 16, 14, 10, 8, 10, 4, 36, 16, 0, 0, 16, 12, 10, 8, 10, 4, 36, 32, 0, 0, 16, 14, 10, 8, 10, 4, 36, 36, 0, 0, 16, 16, 10, 8, 10, 4, 36, 37, 0, 0, 16, 19, 10, 8, 10, 4, 36, 37, 36, 0, 16, 23, 10, 8, 10, 4, 36, 37, 39, 0, 16, 24, 10, 8, 10, 4, 36, 37, 40, 0, 16, 21, 10, 8, 10, 4, 36, 37, 48, 0, 16, 20, 10, 8, 10, 4, 36, 40, 0, 0, 16, 13, 10, 8, 10, 4, 36, 48, 0, 0, 16, 15, 10, 8, 10, 4, 36, 51, 0, 0, 16, 16, 10, 8, 10, 4, 36, 56, 0, 0, 16, 13, 10, 8, 10, 4, 36, 96, 0, 0, 16, 11, 10, 8, 10, 4, 36, 128, 0, 0, 16, 10, 10, 8, 10, 4, 36, 192, 0, 0, 16, 11, 10, 8, 10, 4, 36, 248, 0, 0, 16, 14, 10, 8, 10, 4, 36, 254, 0, 0, 16, 16, 10, 8, 10, 4, 36, 255, 116, 0, 16, 22, 10, 8, 10, 4, 36, 255, 128, 0, 16, 22, 10, 8, 10, 4, 36, 255, 164, 0, 16, 22, 10, 8, 10, 4, 36, 255, 172, 0, 16, 22, 10, 8, 10, 4, 36, 255, 176, 0, 16, 22, 10, 8, 10, 4, 36, 255, 220, 0, 16, 22, 10, 8, 10, 4, 39, 0, 0, 0, 16, 24, 10, 8, 10, 4, 39, 0, 2, 0, 16, 23, 10, 8, 10, 4, 39, 0, 4, 0, 16, 22, 10, 8, 10, 4, 39, 0, 8, 0, 16, 21, 10, 8, 10, 4, 39, 0, 16, 0, 16, 20, 10, 8, 10, 4, 39, 0, 32, 0, 16, 19, 10, 8, 10, 4, 39, 0, 64, 0, 16, 18, 10, 8, 10, 4, 39, 0, 128, 0, 16, 17, 10, 8, 10, 4, 39, 64, 0, 0, 16, 11, 10, 8, 10, 4, 39, 96, 0, 0, 16, 13, 10, 8, 10, 4, 39, 104, 0, 0, 16, 14, 10, 8, 10, 4, 39, 108, 0, 0, 16, 16, 10, 8, 10, 4, 39, 128, 0, 0, 16, 10, 10, 8, 10, 4, 40, 72, 0, 0, 16, 15, 10, 8, 10, 4, 40, 125, 128, 0, 16, 17, 10, 8, 10, 4, 40, 126, 64, 0, 16, 18, 10, 8, 10, 4, 42, 0, 0, 0, 16, 22, 10, 8, 10, 4, 42, 0, 8, 0, 16, 21, 10, 8, 10, 4, 42, 0, 16, 0, 16, 21, 10, 8, 10, 4, 42, 0, 24, 0, 16, 22, 10, 8, 10, 4, 42, 0, 32, 0, 16, 19, 10, 8, 10, 4, 42, 0, 128, 0, 16, 17, 10, 8, 10, 4, 42, 1, 0, 0, 16, 19, 10, 8, 10, 4, 42, 1, 32, 0, 16, 20, 10, 8, 10, 4, 42, 1, 48, 0, 16, 21, 10, 8, 10, 4, 42, 1, 56, 0, 16, 22, 10, 8, 10, 4, 42, 1, 128, 0, 16, 17, 10, 8, 10, 4, 42, 4, 0, 0, 16, 14, 10, 8, 10, 4, 42, 48, 0, 0, 16, 15, 10, 8, 10, 4, 42, 50, 0, 0, 16, 16, 10, 8, 10, 4, 42, 51, 0, 0, 16, 16, 10, 8, 10, 4, 42, 52, 0, 0, 16, 14, 10, 8, 10, 4, 42, 56, 0, 0, 16, 14, 10, 8, 10, 4, 42, 62, 0, 0, 16, 17, 10, 8, 10, 4, 42, 62, 128, 0, 16, 19, 10, 8, 10, 4, 42, 62, 160, 0, 16, 20, 10, 8, 10, 4, 42, 62, 180, 0, 16, 22, 10, 8, 10, 4, 42, 62, 184, 0, 16, 21, 10, 8, 10, 4, 42, 63, 0, 0, 16, 16, 10, 8, 10, 4, 42, 80, 0, 0, 16, 15, 10, 8, 10, 4, 42, 83, 64, 0, 16, 20, 10, 8, 10, 4, 42, 83, 80, 0, 16, 22, 10, 8, 10, 4, 42, 83, 88, 0, 16, 21, 10, 8, 10, 4, 42, 83, 96, 0, 16, 19, 10, 8, 10, 4, 42, 83, 128, 0, 16, 17, 10, 8, 10, 4, 42, 84, 0, 0, 16, 14, 10, 8, 10, 4, 42, 88, 0, 0, 16, 13, 10, 8, 10, 4, 42, 96, 64, 0, 16, 19, 10, 8, 10, 4, 42, 96, 96, 0, 16, 21, 10, 8, 10, 4, 42, 96, 108, 0, 16, 22, 10, 8, 10, 4, 42, 96, 112, 0, 16, 20, 10, 8, 10, 4, 42, 96, 128, 0, 16, 17, 10, 8, 10, 4, 42, 97, 0, 0, 16, 16, 10, 8, 10, 4, 42, 99, 0, 0, 16, 18, 10, 8, 10, 4, 42, 99, 64, 0, 16, 19, 10, 8, 10, 4, 42, 99, 96, 0, 16, 20, 10, 8, 10, 4, 42, 99, 112, 0, 16, 22, 10, 8, 10, 4, 42, 99, 120, 0, 16, 21, 10, 8, 10, 4, 42, 100, 0, 0, 16, 14, 10, 8, 10, 4, 42, 120, 0, 0, 16, 15, 10, 8, 10, 4, 42, 122, 0, 0, 16, 16, 10, 8, 10, 4, 42, 123, 0, 0, 16, 19, 10, 8, 10, 4, 42, 123, 36, 0, 16, 22, 10, 8, 10, 4, 42, 123, 40, 0, 16, 21, 10, 8, 10, 4, 42, 123, 48, 0, 16, 20, 10, 8, 10, 4, 42, 123, 64, 0, 16, 18, 10, 8, 10, 4, 42, 123, 128, 0, 16, 17, 10, 8, 10, 4, 42, 128, 0, 0, 16, 12, 10, 8, 10, 4, 42, 156, 0, 0, 16, 19, 10, 8, 10, 4, 42, 156, 36, 0, 16, 22, 10, 8, 10, 4, 42, 156, 40, 0, 16, 21, 10, 8, 10, 4, 42, 156, 48, 0, 16, 20, 10, 8, 10, 4, 42, 156, 64, 0, 16, 18, 10, 8, 10, 4, 42, 156, 128, 0, 16, 17, 10, 8, 10, 4, 42, 157, 0, 0, 16, 16, 10, 8, 10, 4, 42, 158, 0, 0, 16, 15, 10, 8, 10, 4, 42, 160, 0, 0, 16, 12, 10, 8, 10, 4, 42, 176, 0, 0, 16, 13, 10, 8, 10, 4, 42, 184, 0, 0, 16, 15, 10, 8, 10, 4, 42, 186, 0, 0, 16, 16, 10, 8, 10, 4, 42, 187, 0, 0, 16, 18, 10, 8, 10, 4, 42, 187, 64, 0, 16, 19, 10, 8, 10, 4, 42, 187, 96, 0, 16, 20, 10, 8, 10, 4, 42, 187, 112, 0, 16, 21, 10, 8, 10, 4, 42, 187, 120, 0, 16, 22, 10, 8, 10, 4, 42, 187, 128, 0, 16, 17, 10, 8, 10, 4, 42, 192, 0, 0, 16, 15, 10, 8, 10, 4, 42, 194, 0, 0, 16, 21, 10, 8, 10, 4, 42, 194, 8, 0, 16, 22, 10, 8, 10, 4, 42, 194, 12, 0, 16, 22, 10, 8, 10, 4, 42, 194, 16, 0, 16, 20, 10, 8, 10, 4, 42, 194, 32, 0, 16, 19, 10, 8, 10, 4, 42, 194, 64, 0, 16, 18, 10, 8, 10, 4, 42, 194, 128, 0, 16, 17, 10, 8, 10, 4, 42, 195, 0, 0, 16, 16, 10, 8, 10, 4, 42, 196, 0, 0, 16, 14, 10, 8, 10, 4, 42, 201, 0, 0, 16, 17, 10, 8, 10, 4, 42, 202, 0, 0, 16, 15, 10, 8, 10, 4, 42, 204, 0, 0, 16, 14, 10, 8, 10, 4, 42, 208, 0, 0, 16, 12, 10, 8, 10, 4, 42, 224, 0, 0, 16, 12, 10, 8, 10, 4, 42, 240, 0, 0, 16, 17, 10, 8, 10, 4, 42, 240, 128, 0, 16, 17, 10, 8, 10, 4, 42, 242, 0, 0, 16, 15, 10, 8, 10, 4, 42, 244, 0, 0, 16, 14, 10, 8, 10, 4, 42, 248, 0, 0, 16, 13, 10, 8, 10, 4, 43, 224, 12, 0, 16, 22, 10, 8, 10, 4, 43, 224, 24, 0, 16, 22, 10, 8, 10, 4, 43, 224, 44, 0, 16, 22, 10, 8, 10, 4, 43, 224, 52, 0, 16, 22, 10, 8, 10, 4, 43, 224, 56, 0, 16, 22, 10, 8, 10, 4, 43, 224, 64, 0, 16, 22, 10, 8, 10, 4, 43, 224, 68, 0, 16, 22, 10, 8, 10, 4, 43, 224, 72, 0, 16, 22, 10, 8, 10, 4, 43, 224, 80, 0, 16, 22, 10, 8, 10, 4, 43, 224, 100, 0, 16, 22, 10, 8, 10, 4, 43, 224, 144, 0, 16, 22, 10, 8, 10, 4, 43, 224, 160, 0, 16, 22, 10, 8, 10, 4, 43, 224, 176, 0, 16, 22, 10, 8, 10, 4, 43, 224, 184, 0, 16, 22, 10, 8, 10, 4, 43, 224, 200, 0, 16, 22, 10, 8, 10, 4, 43, 224, 204, 0, 16, 22, 10, 8, 10, 4, 43, 224, 208, 0, 16, 22, 10, 8, 10, 4, 43, 224, 212, 0, 16, 22, 10, 8, 10, 4, 43, 224, 216, 0, 16, 22, 10, 8, 10, 4, 43, 224, 224, 0, 16, 22, 10, 8, 10, 4, 43, 224, 240, 0, 16, 22, 10, 8, 10, 4, 43, 225, 76, 0, 16, 22, 10, 8, 10, 4, 43, 225, 84, 0, 16, 22, 10, 8, 10, 4, 43, 225, 120, 0, 16, 22, 10, 8, 10, 4, 43, 225, 124, 0, 16, 22, 10, 8, 10, 4, 43, 225, 140, 0, 16, 22, 10, 8, 10, 4, 43, 225, 172, 0, 16, 22, 10, 8, 10, 4, 43, 225, 180, 0, 16, 22, 10, 8, 10, 4, 43, 225, 208, 0, 16, 22, 10, 8, 10, 4, 43, 225, 216, 0, 16, 22, 10, 8, 10, 4, 43, 225, 220, 0, 16, 22, 10, 8, 10, 4, 43, 225, 224, 0, 16, 22, 10, 8, 10, 4, 43, 225, 228, 0, 16, 22, 10, 8, 10, 4, 43, 225, 232, 0, 16, 22, 10, 8, 10, 4, 43, 225, 236, 0, 16, 22, 10, 8, 10, 4, 43, 225, 240, 0, 16, 22, 10, 8, 10, 4, 43, 225, 244, 0, 16, 22, 10, 8, 10, 4, 43, 225, 252, 0, 16, 22, 10, 8, 10, 4, 43, 226, 32, 0, 16, 22, 10, 8, 10, 4, 43, 226, 36, 0, 16, 22, 10, 8, 10, 4, 43, 226, 40, 0, 16, 22, 10, 8, 10, 4, 43, 226, 44, 0, 16, 22, 10, 8, 10, 4, 43, 226, 48, 0, 16, 22, 10, 8, 10, 4, 43, 226, 52, 0, 16, 22, 10, 8, 10, 4, 43, 226, 56, 0, 16, 22, 10, 8, 10, 4, 43, 226, 60, 0, 16, 22, 10, 8, 10, 4, 43, 226, 64, 0, 16, 22, 10, 8, 10, 4, 43, 226, 68, 0, 16, 22, 10, 8, 10, 4, 43, 226, 72, 0, 16, 22, 10, 8, 10, 4, 43, 226, 76, 0, 16, 22, 10, 8, 10, 4, 43, 226, 80, 0, 16, 22, 10, 8, 10, 4, 43, 226, 84, 0, 16, 22, 10, 8, 10, 4, 43, 226, 88, 0, 16, 22, 10, 8, 10, 4, 43, 226, 92, 0, 16, 22, 10, 8, 10, 4, 43, 226, 96, 0, 16, 22, 10, 8, 10, 4, 43, 226, 100, 0, 16, 22, 10, 8, 10, 4, 43, 226, 104, 0, 16, 22, 10, 8, 10, 4, 43, 226, 108, 0, 16, 22, 10, 8, 10, 4, 43, 226, 112, 0, 16, 22, 10, 8, 10, 4, 43, 226, 116, 0, 16, 22, 10, 8, 10, 4, 43, 226, 120, 0, 16, 22, 10, 8, 10, 4, 43, 226, 128, 0, 16, 22, 10, 8, 10, 4, 43, 226, 132, 0, 16, 22, 10, 8, 10, 4, 43, 226, 136, 0, 16, 22, 10, 8, 10, 4, 43, 226, 140, 0, 16, 22, 10, 8, 10, 4, 43, 226, 144, 0, 16, 22, 10, 8, 10, 4, 43, 226, 148, 0, 16, 22, 10, 8, 10, 4, 43, 226, 152, 0, 16, 22, 10, 8, 10, 4, 43, 226, 156, 0, 16, 22, 10, 8, 10, 4, 43, 226, 160, 0, 16, 22, 10, 8, 10, 4, 43, 226, 164, 0, 16, 22, 10, 8, 10, 4, 43, 226, 168, 0, 16, 22, 10, 8, 10, 4, 43, 226, 172, 0, 16, 22, 10, 8, 10, 4, 43, 226, 176, 0, 16, 22, 10, 8, 10, 4, 43, 226, 180, 0, 16, 22, 10, 8, 10, 4, 43, 226, 184, 0, 16, 22, 10, 8, 10, 4, 43, 226, 188, 0, 16, 22, 10, 8, 10, 4, 43, 226, 192, 0, 16, 22, 10, 8, 10, 4, 43, 226, 196, 0, 16, 22, 10, 8, 10, 4, 43, 226, 200, 0, 16, 22, 10, 8, 10, 4, 43, 226, 204, 0, 16, 22, 10, 8, 10, 4, 43, 226, 208, 0, 16, 22, 10, 8, 10, 4, 43, 226, 212, 0, 16, 22, 10, 8, 10, 4, 43, 226, 236, 0, 16, 22, 10, 8, 10, 4, 43, 226, 240, 0, 16, 22, 10, 8, 10, 4, 43, 226, 244, 0, 16, 22, 10, 8, 10, 4, 43, 226, 248, 0, 16, 22, 10, 8, 10, 4, 43, 226, 252, 0, 16, 22, 10, 8, 10, 4, 43, 227, 0, 0, 16, 22, 10, 8, 10, 4, 43, 227, 4, 0, 16, 22, 10, 8, 10, 4, 43, 227, 8, 0, 16, 22, 10, 8, 10, 4, 43, 227, 32, 0, 16, 22, 10, 8, 10, 4, 43, 227, 36, 0, 16, 22, 10, 8, 10, 4, 43, 227, 40, 0, 16, 22, 10, 8, 10, 4, 43, 227, 44, 0, 16, 22, 10, 8, 10, 4, 43, 227, 48, 0, 16, 22, 10, 8, 10, 4, 43, 227, 52, 0, 16, 22, 10, 8, 10, 4, 43, 227, 56, 0, 16, 22, 10, 8, 10, 4, 43, 227, 60, 0, 16, 22, 10, 8, 10, 4, 43, 227, 64, 0, 16, 22, 10, 8, 10, 4, 43, 227, 68, 0, 16, 22, 10, 8, 10, 4, 43, 227, 72, 0, 16, 22, 10, 8, 10, 4, 43, 227, 76, 0, 16, 22, 10, 8, 10, 4, 43, 227, 80, 0, 16, 22, 10, 8, 10, 4, 43, 227, 84, 0, 16, 22, 10, 8, 10, 4, 43, 227, 88, 0, 16, 22, 10, 8, 10, 4, 43, 227, 92, 0, 16, 22, 10, 8, 10, 4, 43, 227, 96, 0, 16, 22, 10, 8, 10, 4, 43, 227, 100, 0, 16, 22, 10, 8, 10, 4, 43, 227, 104, 0, 16, 22, 10, 8, 10, 4, 43, 227, 136, 0, 16, 22, 10, 8, 10, 4, 43, 227, 140, 0, 16, 22, 10, 8, 10, 4, 43, 227, 144, 0, 16, 22, 10, 8, 10, 4, 43, 227, 152, 0, 16, 22, 10, 8, 10, 4, 43, 227, 156, 0, 16, 22, 10, 8, 10, 4, 43, 227, 160, 0, 16, 22, 10, 8, 10, 4, 43, 227, 164, 0, 16, 22, 10, 8, 10, 4, 43, 227, 168, 0, 16, 22, 10, 8, 10, 4, 43, 227, 172, 0, 16, 22, 10, 8, 10, 4, 43, 227, 176, 0, 16, 22, 10, 8, 10, 4, 43, 227, 180, 0, 16, 22, 10, 8, 10, 4, 43, 227, 188, 0, 16, 22, 10, 8, 10, 4, 43, 227, 192, 0, 16, 22, 10, 8, 10, 4, 43, 227, 196, 0, 16, 22, 10, 8, 10, 4, 43, 227, 200, 0, 16, 22, 10, 8, 10, 4, 43, 227, 204, 0, 16, 22, 10, 8, 10, 4, 43, 227, 208, 0, 16, 22, 10, 8, 10, 4, 43, 227, 212, 0, 16, 22, 10, 8, 10, 4, 43, 227, 216, 0, 16, 22, 10, 8, 10, 4, 43, 227, 220, 0, 16, 22, 10, 8, 10, 4, 43, 227, 232, 0, 16, 22, 10, 8, 10, 4, 43, 227, 248, 0, 16, 22, 10, 8, 10, 4, 43, 227, 252, 0, 16, 22, 10, 8, 10, 4, 43, 228, 0, 0, 16, 22, 10, 8, 10, 4, 43, 228, 4, 0, 16, 22, 10, 8, 10, 4, 43, 228, 8, 0, 16, 22, 10, 8, 10, 4, 43, 228, 12, 0, 16, 22, 10, 8, 10, 4, 43, 228, 16, 0, 16, 22, 10, 8, 10, 4, 43, 228, 20, 0, 16, 22, 10, 8, 10, 4, 43, 228, 24, 0, 16, 22, 10, 8, 10, 4, 43, 228, 28, 0, 16, 22, 10, 8, 10, 4, 43, 228, 32, 0, 16, 22, 10, 8, 10, 4, 43, 228, 36, 0, 16, 22, 10, 8, 10, 4, 43, 228, 40, 0, 16, 22, 10, 8, 10, 4, 43, 228, 44, 0, 16, 22, 10, 8, 10, 4, 43, 228, 48, 0, 16, 22, 10, 8, 10, 4, 43, 228, 52, 0, 16, 22, 10, 8, 10, 4, 43, 228, 56, 0, 16, 22, 10, 8, 10, 4, 43, 228, 60, 0, 16, 22, 10, 8, 10, 4, 43, 228, 64, 0, 16, 22, 10, 8, 10, 4, 43, 228, 68, 0, 16, 22, 10, 8, 10, 4, 43, 228, 76, 0, 16, 22, 10, 8, 10, 4, 43, 228, 100, 0, 16, 22, 10, 8, 10, 4, 43, 228, 116, 0, 16, 22, 10, 8, 10, 4, 43, 228, 120, 0, 16, 22, 10, 8, 10, 4, 43, 228, 132, 0, 16, 22, 10, 8, 10, 4, 43, 228, 136, 0, 16, 22, 10, 8, 10, 4, 43, 228, 148, 0, 16, 22, 10, 8, 10, 4, 43, 228, 152, 0, 16, 22, 10, 8, 10, 4, 43, 228, 188, 0, 16, 22, 10, 8, 10, 4, 43, 229, 16, 0, 16, 22, 10, 8, 10, 4, 43, 229, 40, 0, 16, 22, 10, 8, 10, 4, 43, 229, 48, 0, 16, 22, 10, 8, 10, 4, 43, 229, 56, 0, 16, 22, 10, 8, 10, 4, 43, 229, 96, 0, 16, 22, 10, 8, 10, 4, 43, 229, 120, 0, 16, 22, 10, 8, 10, 4, 43, 229, 136, 0, 16, 22, 10, 8, 10, 4, 43, 229, 140, 0, 16, 22, 10, 8, 10, 4, 43, 229, 144, 0, 16, 22, 10, 8, 10, 4, 43, 229, 168, 0, 16, 22, 10, 8, 10, 4, 43, 229, 172, 0, 16, 22, 10, 8, 10, 4, 43, 229, 176, 0, 16, 22, 10, 8, 10, 4, 43, 229, 180, 0, 16, 22, 10, 8, 10, 4, 43, 229, 184, 0, 16, 22, 10, 8, 10, 4, 43, 229, 188, 0, 16, 22, 10, 8, 10, 4, 43, 229, 192, 0, 16, 22, 10, 8, 10, 4, 43, 229, 196, 0, 16, 22, 10, 8, 10, 4, 43, 229, 216, 0, 16, 22, 10, 8, 10, 4, 43, 229, 220, 0, 16, 22, 10, 8, 10, 4, 43, 229, 232, 0, 16, 22, 10, 8, 10, 4, 43, 229, 236, 0, 16, 22, 10, 8, 10, 4, 43, 230, 20, 0, 16, 22, 10, 8, 10, 4, 43, 230, 32, 0, 16, 22, 10, 8, 10, 4, 43, 230, 68, 0, 16, 22, 10, 8, 10, 4, 43, 230, 72, 0, 16, 22, 10, 8, 10, 4, 43, 230, 84, 0, 16, 22, 10, 8, 10, 4, 43, 230, 124, 0, 16, 22, 10, 8, 10, 4, 43, 230, 136, 0, 16, 22, 10, 8, 10, 4, 43, 230, 168, 0, 16, 22, 10, 8, 10, 4, 43, 230, 220, 0, 16, 22, 10, 8, 10, 4, 43, 230, 224, 0, 16, 22, 10, 8, 10, 4, 43, 230, 228, 0, 16, 22, 10, 8, 10, 4, 43, 230, 232, 0, 16, 22, 10, 8, 10, 4, 43, 230, 236, 0, 16, 22, 10, 8, 10, 4, 43, 230, 240, 0, 16, 22, 10, 8, 10, 4, 43, 230, 244, 0, 16, 22, 10, 8, 10, 4, 43, 230, 248, 0, 16, 22, 10, 8, 10, 4, 43, 230, 252, 0, 16, 22, 10, 8, 10, 4, 43, 231, 32, 0, 16, 22, 10, 8, 10, 4, 43, 231, 36, 0, 16, 22, 10, 8, 10, 4, 43, 231, 40, 0, 16, 22, 10, 8, 10, 4, 43, 231, 44, 0, 16, 22, 10, 8, 10, 4, 43, 231, 80, 0, 16, 22, 10, 8, 10, 4, 43, 231, 84, 0, 16, 22, 10, 8, 10, 4, 43, 231, 88, 0, 16, 22, 10, 8, 10, 4, 43, 231, 92, 0, 16, 22, 10, 8, 10, 4, 43, 231, 96, 0, 16, 22, 10, 8, 10, 4, 43, 231, 100, 0, 16, 22, 10, 8, 10, 4, 43, 231, 104, 0, 16, 22, 10, 8, 10, 4, 43, 231, 108, 0, 16, 22, 10, 8, 10, 4, 43, 231, 136, 0, 16, 22, 10, 8, 10, 4, 43, 231, 140, 0, 16, 22, 10, 8, 10, 4, 43, 231, 144, 0, 16, 22, 10, 8, 10, 4, 43, 231, 148, 0, 16, 22, 10, 8, 10, 4, 43, 231, 152, 0, 16, 22, 10, 8, 10, 4, 43, 231, 156, 0, 16, 22, 10, 8, 10, 4, 43, 231, 160, 0, 16, 22, 10, 8, 10, 4, 43, 231, 164, 0, 16, 22, 10, 8, 10, 4, 43, 231, 168, 0, 16, 22, 10, 8, 10, 4, 43, 231, 172, 0, 16, 22, 10, 8, 10, 4, 43, 231, 176, 0, 16, 22, 10, 8, 10, 4, 43, 231, 180, 0, 16, 22, 10, 8, 10, 4, 43, 236, 0, 0, 16, 22, 10, 8, 10, 4, 43, 236, 4, 0, 16, 22, 10, 8, 10, 4, 43, 236, 8, 0, 16, 22, 10, 8, 10, 4, 43, 236, 12, 0, 16, 22, 10, 8, 10, 4, 43, 236, 16, 0, 16, 22, 10, 8, 10, 4, 43, 236, 20, 0, 16, 22, 10, 8, 10, 4, 43, 236, 24, 0, 16, 22, 10, 8, 10, 4, 43, 236, 28, 0, 16, 22, 10, 8, 10, 4, 43, 236, 32, 0, 16, 22, 10, 8, 10, 4, 43, 236, 36, 0, 16, 22, 10, 8, 10, 4, 43, 236, 40, 0, 16, 22, 10, 8, 10, 4, 43, 236, 44, 0, 16, 22, 10, 8, 10, 4, 43, 236, 48, 0, 16, 22, 10, 8, 10, 4, 43, 236, 52, 0, 16, 22, 10, 8, 10, 4, 43, 236, 56, 0, 16, 22, 10, 8, 10, 4, 43, 236, 60, 0, 16, 22, 10, 8, 10, 4, 43, 236, 64, 0, 16, 22, 10, 8, 10, 4, 43, 236, 68, 0, 16, 22, 10, 8, 10, 4, 43, 236, 72, 0, 16, 22, 10, 8, 10, 4, 43, 236, 76, 0, 16, 22, 10, 8, 10, 4, 43, 236, 80, 0, 16, 22, 10, 8, 10, 4, 43, 236, 84, 0, 16, 22, 10, 8, 10, 4, 43, 236, 88, 0, 16, 22, 10, 8, 10, 4, 43, 236, 92, 0, 16, 22, 10, 8, 10, 4, 43, 236, 96, 0, 16, 22, 10, 8, 10, 4, 43, 236, 100, 0, 16, 22, 10, 8, 10, 4, 43, 236, 104, 0, 16, 22, 10, 8, 10, 4, 43, 236, 108, 0, 16, 22, 10, 8, 10, 4, 43, 236, 112, 0, 16, 22, 10, 8, 10, 4, 43, 236, 116, 0, 16, 22, 10, 8, 10, 4, 43, 236, 120, 0, 16, 22, 10, 8, 10, 4, 43, 236, 124, 0, 16, 22, 10, 8, 10, 4, 43, 236, 128, 0, 16, 22, 10, 8, 10, 4, 43, 236, 132, 0, 16, 22, 10, 8, 10, 4, 43, 236, 136, 0, 16, 22, 10, 8, 10, 4, 43, 236, 140, 0, 16, 22, 10, 8, 10, 4, 43, 236, 144, 0, 16, 22, 10, 8, 10, 4, 43, 236, 148, 0, 16, 22, 10, 8, 10, 4, 43, 236, 152, 0, 16, 22, 10, 8, 10, 4, 43, 236, 156, 0, 16, 22, 10, 8, 10, 4, 43, 236, 160, 0, 16, 22, 10, 8, 10, 4, 43, 236, 164, 0, 16, 22, 10, 8, 10, 4, 43, 236, 168, 0, 16, 22, 10, 8, 10, 4, 43, 236, 172, 0, 16, 22, 10, 8, 10, 4, 43, 236, 176, 0, 16, 22, 10, 8, 10, 4, 43, 236, 180, 0, 16, 22, 10, 8, 10, 4, 43, 236, 184, 0, 16, 22, 10, 8, 10, 4, 43, 236, 188, 0, 16, 22, 10, 8, 10, 4, 43, 236, 192, 0, 16, 22, 10, 8, 10, 4, 43, 236, 196, 0, 16, 22, 10, 8, 10, 4, 43, 236, 200, 0, 16, 22, 10, 8, 10, 4, 43, 236, 204, 0, 16, 22, 10, 8, 10, 4, 43, 236, 208, 0, 16, 22, 10, 8, 10, 4, 43, 236, 212, 0, 16, 22, 10, 8, 10, 4, 43, 236, 216, 0, 16, 22, 10, 8, 10, 4, 43, 236, 220, 0, 16, 22, 10, 8, 10, 4, 43, 236, 224, 0, 16, 22, 10, 8, 10, 4, 43, 236, 228, 0, 16, 22, 10, 8, 10, 4, 43, 236, 232, 0, 16, 22, 10, 8, 10, 4, 43, 236, 236, 0, 16, 22, 10, 8, 10, 4, 43, 236, 240, 0, 16, 22, 10, 8, 10, 4, 43, 236, 244, 0, 16, 22, 10, 8, 10, 4, 43, 236, 248, 0, 16, 22, 10, 8, 10, 4, 43, 236, 252, 0, 16, 22, 10, 8, 10, 4, 43, 237, 0, 0, 16, 22, 10, 8, 10, 4, 43, 237, 4, 0, 16, 22, 10, 8, 10, 4, 43, 237, 8, 0, 16, 22, 10, 8, 10, 4, 43, 237, 12, 0, 16, 22, 10, 8, 10, 4, 43, 237, 16, 0, 16, 22, 10, 8, 10, 4, 43, 237, 20, 0, 16, 22, 10, 8, 10, 4, 43, 237, 24, 0, 16, 22, 10, 8, 10, 4, 43, 237, 28, 0, 16, 22, 10, 8, 10, 4, 43, 237, 32, 0, 16, 22, 10, 8, 10, 4, 43, 237, 36, 0, 16, 22, 10, 8, 10, 4, 43, 237, 40, 0, 16, 22, 10, 8, 10, 4, 43, 237, 44, 0, 16, 22, 10, 8, 10, 4, 43, 237, 48, 0, 16, 22, 10, 8, 10, 4, 43, 237, 52, 0, 16, 22, 10, 8, 10, 4, 43, 237, 56, 0, 16, 22, 10, 8, 10, 4, 43, 237, 60, 0, 16, 22, 10, 8, 10, 4, 43, 237, 64, 0, 16, 22, 10, 8, 10, 4, 43, 237, 68, 0, 16, 22, 10, 8, 10, 4, 43, 237, 72, 0, 16, 22, 10, 8, 10, 4, 43, 237, 76, 0, 16, 22, 10, 8, 10, 4, 43, 237, 80, 0, 16, 22, 10, 8, 10, 4, 43, 237, 84, 0, 16, 22, 10, 8, 10, 4, 43, 237, 88, 0, 16, 22, 10, 8, 10, 4, 43, 237, 92, 0, 16, 22, 10, 8, 10, 4, 43, 237, 96, 0, 16, 22, 10, 8, 10, 4, 43, 237, 100, 0, 16, 22, 10, 8, 10, 4, 43, 237, 104, 0, 16, 22, 10, 8, 10, 4, 43, 237, 108, 0, 16, 22, 10, 8, 10, 4, 43, 237, 112, 0, 16, 22, 10, 8, 10, 4, 43, 237, 116, 0, 16, 22, 10, 8, 10, 4, 43, 237, 120, 0, 16, 22, 10, 8, 10, 4, 43, 237, 124, 0, 16, 22, 10, 8, 10, 4, 43, 237, 128, 0, 16, 22, 10, 8, 10, 4, 43, 237, 132, 0, 16, 22, 10, 8, 10, 4, 43, 237, 136, 0, 16, 22, 10, 8, 10, 4, 43, 237, 140, 0, 16, 22, 10, 8, 10, 4, 43, 237, 144, 0, 16, 22, 10, 8, 10, 4, 43, 237, 148, 0, 16, 22, 10, 8, 10, 4, 43, 237, 152, 0, 16, 22, 10, 8, 10, 4, 43, 237, 156, 0, 16, 22, 10, 8, 10, 4, 43, 237, 160, 0, 16, 22, 10, 8, 10, 4, 43, 237, 164, 0, 16, 22, 10, 8, 10, 4, 43, 237, 168, 0, 16, 22, 10, 8, 10, 4, 43, 237, 172, 0, 16, 22, 10, 8, 10, 4, 43, 237, 176, 0, 16, 22, 10, 8, 10, 4, 43, 237, 180, 0, 16, 22, 10, 8, 10, 4, 43, 237, 184, 0, 16, 22, 10, 8, 10, 4, 43, 237, 188, 0, 16, 22, 10, 8, 10, 4, 43, 237, 192, 0, 16, 22, 10, 8, 10, 4, 43, 237, 196, 0, 16, 22, 10, 8, 10, 4, 43, 237, 200, 0, 16, 22, 10, 8, 10, 4, 43, 237, 204, 0, 16, 22, 10, 8, 10, 4, 43, 237, 208, 0, 16, 22, 10, 8, 10, 4, 43, 237, 212, 0, 16, 22, 10, 8, 10, 4, 43, 237, 216, 0, 16, 22, 10, 8, 10, 4, 43, 237, 220, 0, 16, 22, 10, 8, 10, 4, 43, 237, 224, 0, 16, 22, 10, 8, 10, 4, 43, 237, 228, 0, 16, 22, 10, 8, 10, 4, 43, 237, 232, 0, 16, 22, 10, 8, 10, 4, 43, 237, 236, 0, 16, 22, 10, 8, 10, 4, 43, 237, 240, 0, 16, 22, 10, 8, 10, 4, 43, 237, 244, 0, 16, 22, 10, 8, 10, 4, 43, 237, 248, 0, 16, 22, 10, 8, 10, 4, 43, 237, 252, 0, 16, 22, 10, 8, 10, 4, 43, 238, 0, 0, 16, 22, 10, 8, 10, 4, 43, 238, 4, 0, 16, 22, 10, 8, 10, 4, 43, 238, 8, 0, 16, 22, 10, 8, 10, 4, 43, 238, 12, 0, 16, 22, 10, 8, 10, 4, 43, 238, 16, 0, 16, 22, 10, 8, 10, 4, 43, 238, 20, 0, 16, 22, 10, 8, 10, 4, 43, 238, 24, 0, 16, 22, 10, 8, 10, 4, 43, 238, 28, 0, 16, 22, 10, 8, 10, 4, 43, 238, 32, 0, 16, 22, 10, 8, 10, 4, 43, 238, 36, 0, 16, 22, 10, 8, 10, 4, 43, 238, 40, 0, 16, 22, 10, 8, 10, 4, 43, 238, 44, 0, 16, 22, 10, 8, 10, 4, 43, 238, 48, 0, 16, 22, 10, 8, 10, 4, 43, 238, 52, 0, 16, 22, 10, 8, 10, 4, 43, 238, 56, 0, 16, 22, 10, 8, 10, 4, 43, 238, 60, 0, 16, 22, 10, 8, 10, 4, 43, 238, 64, 0, 16, 22, 10, 8, 10, 4, 43, 238, 68, 0, 16, 22, 10, 8, 10, 4, 43, 238, 72, 0, 16, 22, 10, 8, 10, 4, 43, 238, 76, 0, 16, 22, 10, 8, 10, 4, 43, 238, 80, 0, 16, 22, 10, 8, 10, 4, 43, 238, 84, 0, 16, 22, 10, 8, 10, 4, 43, 238, 88, 0, 16, 22, 10, 8, 10, 4, 43, 238, 92, 0, 16, 22, 10, 8, 10, 4, 43, 238, 96, 0, 16, 22, 10, 8, 10, 4, 43, 238, 100, 0, 16, 22, 10, 8, 10, 4, 43, 238, 104, 0, 16, 22, 10, 8, 10, 4, 43, 238, 108, 0, 16, 22, 10, 8, 10, 4, 43, 238, 112, 0, 16, 22, 10, 8, 10, 4, 43, 238, 116, 0, 16, 22, 10, 8, 10, 4, 43, 238, 120, 0, 16, 22, 10, 8, 10, 4, 43, 238, 124, 0, 16, 22, 10, 8, 10, 4, 43, 238, 128, 0, 16, 22, 10, 8, 10, 4, 43, 238, 132, 0, 16, 22, 10, 8, 10, 4, 43, 238, 136, 0, 16, 22, 10, 8, 10, 4, 43, 238, 140, 0, 16, 22, 10, 8, 10, 4, 43, 238, 144, 0, 16, 22, 10, 8, 10, 4, 43, 238, 148, 0, 16, 22, 10, 8, 10, 4, 43, 238, 152, 0, 16, 22, 10, 8, 10, 4, 43, 238, 156, 0, 16, 22, 10, 8, 10, 4, 43, 238, 160, 0, 16, 22, 10, 8, 10, 4, 43, 238, 164, 0, 16, 22, 10, 8, 10, 4, 43, 238, 168, 0, 16, 22, 10, 8, 10, 4, 43, 238, 172, 0, 16, 22, 10, 8, 10, 4, 43, 238, 176, 0, 16, 22, 10, 8, 10, 4, 43, 238, 180, 0, 16, 22, 10, 8, 10, 4, 43, 238, 184, 0, 16, 22, 10, 8, 10, 4, 43, 238, 188, 0, 16, 22, 10, 8, 10, 4, 43, 238, 192, 0, 16, 22, 10, 8, 10, 4, 43, 238, 196, 0, 16, 22, 10, 8, 10, 4, 43, 238, 200, 0, 16, 22, 10, 8, 10, 4, 43, 238, 204, 0, 16, 22, 10, 8, 10, 4, 43, 238, 208, 0, 16, 22, 10, 8, 10, 4, 43, 238, 212, 0, 16, 22, 10, 8, 10, 4, 43, 238, 216, 0, 16, 22, 10, 8, 10, 4, 43, 238, 220, 0, 16, 22, 10, 8, 10, 4, 43, 238, 224, 0, 16, 22, 10, 8, 10, 4, 43, 238, 228, 0, 16, 22, 10, 8, 10, 4, 43, 238, 232, 0, 16, 22, 10, 8, 10, 4, 43, 238, 236, 0, 16, 22, 10, 8, 10, 4, 43, 238, 240, 0, 16, 22, 10, 8, 10, 4, 43, 238, 244, 0, 16, 22, 10, 8, 10, 4, 43, 238, 248, 0, 16, 22, 10, 8, 10, 4, 43, 238, 252, 0, 16, 22, 10, 8, 10, 4, 43, 239, 0, 0, 16, 22, 10, 8, 10, 4, 43, 239, 4, 0, 16, 22, 10, 8, 10, 4, 43, 239, 8, 0, 16, 21, 10, 8, 10, 4, 43, 239, 16, 0, 16, 22, 10, 8, 10, 4, 43, 239, 20, 0, 16, 22, 10, 8, 10, 4, 43, 239, 24, 0, 16, 22, 10, 8, 10, 4, 43, 239, 28, 0, 16, 22, 10, 8, 10, 4, 43, 239, 32, 0, 16, 22, 10, 8, 10, 4, 43, 239, 36, 0, 16, 22, 10, 8, 10, 4, 43, 239, 40, 0, 16, 22, 10, 8, 10, 4, 43, 239, 44, 0, 16, 22, 10, 8, 10, 4, 43, 239, 48, 0, 16, 22, 10, 8, 10, 4, 43, 239, 116, 0, 16, 22, 10, 8, 10, 4, 43, 239, 120, 0, 16, 22, 10, 8, 10, 4, 43, 239, 172, 0, 16, 22, 10, 8, 10, 4, 43, 239, 176, 0, 16, 22, 10, 8, 10, 4, 43, 240, 0, 0, 16, 22, 10, 8, 10, 4, 43, 240, 48, 0, 16, 22, 10, 8, 10, 4, 43, 240, 56, 0, 16, 22, 10, 8, 10, 4, 43, 240, 60, 0, 16, 22, 10, 8, 10, 4, 43, 240, 68, 0, 16, 22, 10, 8, 10, 4, 43, 240, 72, 0, 16, 22, 10, 8, 10, 4, 43, 240, 76, 0, 16, 22, 10, 8, 10, 4, 43, 240, 84, 0, 16, 22, 10, 8, 10, 4, 43, 240, 124, 0, 16, 22, 10, 8, 10, 4, 43, 240, 128, 0, 16, 22, 10, 8, 10, 4, 43, 240, 132, 0, 16, 22, 10, 8, 10, 4, 43, 240, 136, 0, 16, 22, 10, 8, 10, 4, 43, 240, 156, 0, 16, 22, 10, 8, 10, 4, 43, 240, 160, 0, 16, 22, 10, 8, 10, 4, 43, 240, 164, 0, 16, 22, 10, 8, 10, 4, 43, 240, 168, 0, 16, 22, 10, 8, 10, 4, 43, 240, 172, 0, 16, 22, 10, 8, 10, 4, 43, 240, 176, 0, 16, 22, 10, 8, 10, 4, 43, 240, 180, 0, 16, 22, 10, 8, 10, 4, 43, 240, 184, 0, 16, 22, 10, 8, 10, 4, 43, 240, 188, 0, 16, 22, 10, 8, 10, 4, 43, 240, 192, 0, 16, 22, 10, 8, 10, 4, 43, 240, 196, 0, 16, 22, 10, 8, 10, 4, 43, 240, 200, 0, 16, 22, 10, 8, 10, 4, 43, 240, 204, 0, 16, 22, 10, 8, 10, 4, 43, 240, 208, 0, 16, 22, 10, 8, 10, 4, 43, 240, 212, 0, 16, 22, 10, 8, 10, 4, 43, 240, 216, 0, 16, 22, 10, 8, 10, 4, 43, 240, 220, 0, 16, 22, 10, 8, 10, 4, 43, 240, 236, 0, 16, 22, 10, 8, 10, 4, 43, 240, 240, 0, 16, 22, 10, 8, 10, 4, 43, 240, 244, 0, 16, 22, 10, 8, 10, 4, 43, 240, 248, 0, 16, 22, 10, 8, 10, 4, 43, 240, 252, 0, 16, 22, 10, 8, 10, 4, 43, 241, 0, 0, 16, 22, 10, 8, 10, 4, 43, 241, 4, 0, 16, 22, 10, 8, 10, 4, 43, 241, 8, 0, 16, 22, 10, 8, 10, 4, 43, 241, 12, 0, 16, 22, 10, 8, 10, 4, 43, 241, 16, 0, 16, 22, 10, 8, 10, 4, 43, 241, 20, 0, 16, 22, 10, 8, 10, 4, 43, 241, 48, 0, 16, 22, 10, 8, 10, 4, 43, 241, 76, 0, 16, 22, 10, 8, 10, 4, 43, 241, 80, 0, 16, 22, 10, 8, 10, 4, 43, 241, 84, 0, 16, 22, 10, 8, 10, 4, 43, 241, 88, 0, 16, 22, 10, 8, 10, 4, 43, 241, 92, 0, 16, 22, 10, 8, 10, 4, 43, 241, 112, 0, 16, 22, 10, 8, 10, 4, 43, 241, 168, 0, 16, 22, 10, 8, 10, 4, 43, 241, 172, 0, 16, 22, 10, 8, 10, 4, 43, 241, 176, 0, 16, 22, 10, 8, 10, 4, 43, 241, 180, 0, 16, 22, 10, 8, 10, 4, 43, 241, 184, 0, 16, 22, 10, 8, 10, 4, 43, 241, 196, 0, 16, 22, 10, 8, 10, 4, 43, 241, 208, 0, 16, 22, 10, 8, 10, 4, 43, 241, 212, 0, 16, 22, 10, 8, 10, 4, 43, 241, 216, 0, 16, 22, 10, 8, 10, 4, 43, 241, 220, 0, 16, 22, 10, 8, 10, 4, 43, 241, 224, 0, 16, 22, 10, 8, 10, 4, 43, 241, 228, 0, 16, 22, 10, 8, 10, 4, 43, 241, 232, 0, 16, 22, 10, 8, 10, 4, 43, 241, 236, 0, 16, 22, 10, 8, 10, 4, 43, 241, 240, 0, 16, 22, 10, 8, 10, 4, 43, 241, 248, 0, 16, 22, 10, 8, 10, 4, 43, 241, 252, 0, 16, 22, 10, 8, 10, 4, 43, 242, 8, 0, 16, 22, 10, 8, 10, 4, 43, 242, 12, 0, 16, 22, 10, 8, 10, 4, 43, 242, 16, 0, 16, 22, 10, 8, 10, 4, 43, 242, 20, 0, 16, 22, 10, 8, 10, 4, 43, 242, 24, 0, 16, 22, 10, 8, 10, 4, 43, 242, 28, 0, 16, 22, 10, 8, 10, 4, 43, 242, 44, 0, 16, 22, 10, 8, 10, 4, 43, 242, 48, 0, 16, 22, 10, 8, 10, 4, 43, 242, 52, 0, 16, 22, 10, 8, 10, 4, 43, 242, 56, 0, 16, 22, 10, 8, 10, 4, 43, 242, 60, 0, 16, 22, 10, 8, 10, 4, 43, 242, 64, 0, 16, 22, 10, 8, 10, 4, 43, 242, 72, 0, 16, 22, 10, 8, 10, 4, 43, 242, 76, 0, 16, 22, 10, 8, 10, 4, 43, 242, 80, 0, 16, 22, 10, 8, 10, 4, 43, 242, 84, 0, 16, 22, 10, 8, 10, 4, 43, 242, 88, 0, 16, 22, 10, 8, 10, 4, 43, 242, 92, 0, 16, 22, 10, 8, 10, 4, 43, 242, 96, 0, 16, 22, 10, 8, 10, 4, 43, 242, 144, 0, 16, 22, 10, 8, 10, 4, 43, 242, 148, 0, 16, 22, 10, 8, 10, 4, 43, 242, 152, 0, 16, 22, 10, 8, 10, 4, 43, 242, 156, 0, 16, 22, 10, 8, 10, 4, 43, 242, 160, 0, 16, 22, 10, 8, 10, 4, 43, 242, 164, 0, 16, 22, 10, 8, 10, 4, 43, 242, 168, 0, 16, 22, 10, 8, 10, 4, 43, 242, 180, 0, 16, 22, 10, 8, 10, 4, 43, 242, 188, 0, 16, 22, 10, 8, 10, 4, 43, 242, 192, 0, 16, 22, 10, 8, 10, 4, 43, 242, 196, 0, 16, 22, 10, 8, 10, 4, 43, 242, 204, 0, 16, 22, 10, 8, 10, 4, 43, 242, 216, 0, 16, 22, 10, 8, 10, 4, 43, 242, 220, 0, 16, 22, 10, 8, 10, 4, 43, 242, 252, 0, 16, 22, 10, 8, 10, 4, 43, 243, 4, 0, 16, 22, 10, 8, 10, 4, 43, 243, 8, 0, 16, 22, 10, 8, 10, 4, 43, 243, 12, 0, 16, 22, 10, 8, 10, 4, 43, 243, 16, 0, 16, 22, 10, 8, 10, 4, 43, 243, 24, 0, 16, 22, 10, 8, 10, 4, 43, 243, 88, 0, 16, 22, 10, 8, 10, 4, 43, 243, 128, 0, 16, 22, 10, 8, 10, 4, 43, 243, 136, 0, 16, 22, 10, 8, 10, 4, 43, 243, 144, 0, 16, 22, 10, 8, 10, 4, 43, 243, 148, 0, 16, 22, 10, 8, 10, 4, 43, 243, 156, 0, 16, 22, 10, 8, 10, 4, 43, 243, 168, 0, 16, 22, 10, 8, 10, 4, 43, 243, 180, 0, 16, 22, 10, 8, 10, 4, 43, 243, 188, 0, 16, 22, 10, 8, 10, 4, 43, 243, 228, 0, 16, 22, 10, 8, 10, 4, 43, 243, 232, 0, 16, 22, 10, 8, 10, 4, 43, 243, 244, 0, 16, 22, 10, 8, 10, 4, 43, 246, 0, 0, 16, 22, 10, 8, 10, 4, 43, 246, 4, 0, 16, 22, 10, 8, 10, 4, 43, 246, 8, 0, 16, 22, 10, 8, 10, 4, 43, 246, 12, 0, 16, 22, 10, 8, 10, 4, 43, 246, 16, 0, 16, 22, 10, 8, 10, 4, 43, 246, 20, 0, 16, 22, 10, 8, 10, 4, 43, 246, 24, 0, 16, 22, 10, 8, 10, 4, 43, 246, 28, 0, 16, 22, 10, 8, 10, 4, 43, 246, 32, 0, 16, 22, 10, 8, 10, 4, 43, 246, 36, 0, 16, 22, 10, 8, 10, 4, 43, 246, 40, 0, 16, 22, 10, 8, 10, 4, 43, 246, 44, 0, 16, 22, 10, 8, 10, 4, 43, 246, 48, 0, 16, 22, 10, 8, 10, 4, 43, 246, 52, 0, 16, 22, 10, 8, 10, 4, 43, 246, 56, 0, 16, 22, 10, 8, 10, 4, 43, 246, 60, 0, 16, 22, 10, 8, 10, 4, 43, 246, 64, 0, 16, 22, 10, 8, 10, 4, 43, 246, 68, 0, 16, 22, 10, 8, 10, 4, 43, 246, 72, 0, 16, 22, 10, 8, 10, 4, 43, 246, 76, 0, 16, 22, 10, 8, 10, 4, 43, 246, 80, 0, 16, 22, 10, 8, 10, 4, 43, 246, 84, 0, 16, 22, 10, 8, 10, 4, 43, 246, 88, 0, 16, 22, 10, 8, 10, 4, 43, 246, 92, 0, 16, 22, 10, 8, 10, 4, 43, 246, 96, 0, 16, 22, 10, 8, 10, 4, 43, 246, 112, 0, 16, 22, 10, 8, 10, 4, 43, 246, 212, 0, 16, 22, 10, 8, 10, 4, 43, 246, 228, 0, 16, 22, 10, 8, 10, 4, 43, 247, 4, 0, 16, 22, 10, 8, 10, 4, 43, 247, 8, 0, 16, 22, 10, 8, 10, 4, 43, 247, 44, 0, 16, 22, 10, 8, 10, 4, 43, 247, 48, 0, 16, 22, 10, 8, 10, 4, 43, 247, 68, 0, 16, 22, 10, 8, 10, 4, 43, 247, 76, 0, 16, 22, 10, 8, 10, 4, 43, 247, 84, 0, 16, 22, 10, 8, 10, 4, 43, 247, 88, 0, 16, 22, 10, 8, 10, 4, 43, 247, 92, 0, 16, 22, 10, 8, 10, 4, 43, 247, 96, 0, 16, 22, 10, 8, 10, 4, 43, 247, 100, 0, 16, 22, 10, 8, 10, 4, 43, 247, 108, 0, 16, 22, 10, 8, 10, 4, 43, 247, 112, 0, 16, 22, 10, 8, 10, 4, 43, 247, 148, 0, 16, 22, 10, 8, 10, 4, 43, 247, 152, 0, 16, 22, 10, 8, 10, 4, 43, 247, 176, 0, 16, 22, 10, 8, 10, 4, 43, 247, 180, 0, 16, 22, 10, 8, 10, 4, 43, 247, 184, 0, 16, 22, 10, 8, 10, 4, 43, 247, 188, 0, 16, 22, 10, 8, 10, 4, 43, 247, 196, 0, 16, 22, 10, 8, 10, 4, 43, 247, 200, 0, 16, 22, 10, 8, 10, 4, 43, 247, 204, 0, 16, 22, 10, 8, 10, 4, 43, 247, 208, 0, 16, 22, 10, 8, 10, 4, 43, 247, 212, 0, 16, 22, 10, 8, 10, 4, 43, 247, 216, 0, 16, 22, 10, 8, 10, 4, 43, 247, 220, 0, 16, 22, 10, 8, 10, 4, 43, 247, 224, 0, 16, 22, 10, 8, 10, 4, 43, 247, 228, 0, 16, 22, 10, 8, 10, 4, 43, 247, 232, 0, 16, 22, 10, 8, 10, 4, 43, 247, 236, 0, 16, 22, 10, 8, 10, 4, 43, 247, 240, 0, 16, 22, 10, 8, 10, 4, 43, 247, 244, 0, 16, 22, 10, 8, 10, 4, 43, 247, 248, 0, 16, 22, 10, 8, 10, 4, 43, 247, 252, 0, 16, 22, 10, 8, 10, 4, 43, 248, 0, 0, 16, 22, 10, 8, 10, 4, 43, 248, 4, 0, 16, 22, 10, 8, 10, 4, 43, 248, 20, 0, 16, 22, 10, 8, 10, 4, 43, 248, 28, 0, 16, 22, 10, 8, 10, 4, 43, 248, 48, 0, 16, 22, 10, 8, 10, 4, 43, 248, 76, 0, 16, 22, 10, 8, 10, 4, 43, 248, 80, 0, 16, 22, 10, 8, 10, 4, 43, 248, 84, 0, 16, 22, 10, 8, 10, 4, 43, 248, 88, 0, 16, 22, 10, 8, 10, 4, 43, 248, 92, 0, 16, 22, 10, 8, 10, 4, 43, 248, 96, 0, 16, 22, 10, 8, 10, 4, 43, 248, 100, 0, 16, 22, 10, 8, 10, 4, 43, 248, 104, 0, 16, 22, 10, 8, 10, 4, 43, 248, 108, 0, 16, 22, 10, 8, 10, 4, 43, 248, 112, 0, 16, 22, 10, 8, 10, 4, 43, 248, 116, 0, 16, 22, 10, 8, 10, 4, 43, 248, 120, 0, 16, 22, 10, 8, 10, 4, 43, 248, 124, 0, 16, 22, 10, 8, 10, 4, 43, 248, 128, 0, 16, 22, 10, 8, 10, 4, 43, 248, 132, 0, 16, 22, 10, 8, 10, 4, 43, 248, 136, 0, 16, 22, 10, 8, 10, 4, 43, 248, 140, 0, 16, 22, 10, 8, 10, 4, 43, 248, 144, 0, 16, 22, 10, 8, 10, 4, 43, 248, 148, 0, 16, 22, 10, 8, 10, 4, 43, 248, 176, 0, 16, 22, 10, 8, 10, 4, 43, 248, 180, 0, 16, 22, 10, 8, 10, 4, 43, 248, 184, 0, 16, 22, 10, 8, 10, 4, 43, 248, 188, 0, 16, 22, 10, 8, 10, 4, 43, 248, 192, 0, 16, 22, 10, 8, 10, 4, 43, 248, 196, 0, 16, 22, 10, 8, 10, 4, 43, 248, 200, 0, 16, 22, 10, 8, 10, 4, 43, 248, 204, 0, 16, 22, 10, 8, 10, 4, 43, 248, 208, 0, 16, 22, 10, 8, 10, 4, 43, 248, 228, 0, 16, 22, 10, 8, 10, 4, 43, 248, 232, 0, 16, 22, 10, 8, 10, 4, 43, 248, 244, 0, 16, 22, 10, 8, 10, 4, 43, 249, 0, 0, 16, 22, 10, 8, 10, 4, 43, 249, 4, 0, 16, 22, 10, 8, 10, 4, 43, 249, 8, 0, 16, 22, 10, 8, 10, 4, 43, 249, 24, 0, 16, 22, 10, 8, 10, 4, 43, 249, 120, 0, 16, 22, 10, 8, 10, 4, 43, 249, 132, 0, 16, 22, 10, 8, 10, 4, 43, 249, 136, 0, 16, 22, 10, 8, 10, 4, 43, 249, 144, 0, 16, 22, 10, 8, 10, 4, 43, 249, 148, 0, 16, 22, 10, 8, 10, 4, 43, 249, 152, 0, 16, 22, 10, 8, 10, 4, 43, 249, 156, 0, 16, 22, 10, 8, 10, 4, 43, 249, 160, 0, 16, 22, 10, 8, 10, 4, 43, 249, 164, 0, 16, 22, 10, 8, 10, 4, 43, 249, 168, 0, 16, 22, 10, 8, 10, 4, 43, 249, 192, 0, 16, 22, 10, 8, 10, 4, 43, 249, 236, 0, 16, 22, 10, 8, 10, 4, 43, 250, 4, 0, 16, 22, 10, 8, 10, 4, 43, 250, 12, 0, 16, 22, 10, 8, 10, 4, 43, 250, 16, 0, 16, 22, 10, 8, 10, 4, 43, 250, 20, 0, 16, 22, 10, 8, 10, 4, 43, 250, 28, 0, 16, 22, 10, 8, 10, 4, 43, 250, 32, 0, 16, 22, 10, 8, 10, 4, 43, 250, 36, 0, 16, 22, 10, 8, 10, 4, 43, 250, 72, 0, 16, 22, 10, 8, 10, 4, 43, 250, 96, 0, 16, 22, 10, 8, 10, 4, 43, 250, 100, 0, 16, 22, 10, 8, 10, 4, 43, 250, 104, 0, 16, 22, 10, 8, 10, 4, 43, 250, 108, 0, 16, 22, 10, 8, 10, 4, 43, 250, 112, 0, 16, 22, 10, 8, 10, 4, 43, 250, 116, 0, 16, 22, 10, 8, 10, 4, 43, 250, 128, 0, 16, 22, 10, 8, 10, 4, 43, 250, 144, 0, 16, 22, 10, 8, 10, 4, 43, 250, 148, 0, 16, 22, 10, 8, 10, 4, 43, 250, 160, 0, 16, 22, 10, 8, 10, 4, 43, 250, 168, 0, 16, 22, 10, 8, 10, 4, 43, 250, 172, 0, 16, 22, 10, 8, 10, 4, 43, 250, 176, 0, 16, 22, 10, 8, 10, 4, 43, 250, 200, 0, 16, 22, 10, 8, 10, 4, 43, 250, 212, 0, 16, 22, 10, 8, 10, 4, 43, 250, 216, 0, 16, 22, 10, 8, 10, 4, 43, 250, 220, 0, 16, 22, 10, 8, 10, 4, 43, 250, 236, 0, 16, 22, 10, 8, 10, 4, 43, 250, 244, 0, 16, 22, 10, 8, 10, 4, 43, 251, 4, 0, 16, 22, 10, 8, 10, 4, 43, 251, 8, 0, 16, 22, 10, 8, 10, 4, 43, 251, 12, 0, 16, 22, 10, 8, 10, 4, 43, 251, 36, 0, 16, 22, 10, 8, 10, 4, 43, 251, 116, 0, 16, 22, 10, 8, 10, 4, 43, 251, 192, 0, 16, 22, 10, 8, 10, 4, 43, 251, 232, 0, 16, 22, 10, 8, 10, 4, 43, 251, 236, 0, 16, 22, 10, 8, 10, 4, 43, 251, 244, 0, 16, 22, 10, 8, 10, 4, 43, 252, 40, 0, 16, 22, 10, 8, 10, 4, 43, 252, 48, 0, 16, 22, 10, 8, 10, 4, 43, 252, 56, 0, 16, 22, 10, 8, 10, 4, 43, 252, 224, 0, 16, 22, 10, 8, 10, 4, 43, 254, 0, 0, 16, 22, 10, 8, 10, 4, 43, 254, 4, 0, 16, 22, 10, 8, 10, 4, 43, 254, 8, 0, 16, 22, 10, 8, 10, 4, 43, 254, 24, 0, 16, 22, 10, 8, 10, 4, 43, 254, 36, 0, 16, 22, 10, 8, 10, 4, 43, 254, 44, 0, 16, 22, 10, 8, 10, 4, 43, 254, 52, 0, 16, 22, 10, 8, 10, 4, 43, 254, 64, 0, 16, 22, 10, 8, 10, 4, 43, 254, 72, 0, 16, 22, 10, 8, 10, 4, 43, 254, 84, 0, 16, 22, 10, 8, 10, 4, 43, 254, 88, 0, 16, 22, 10, 8, 10, 4, 43, 254, 92, 0, 16, 22, 10, 8, 10, 4, 43, 254, 100, 0, 16, 22, 10, 8, 10, 4, 43, 254, 104, 0, 16, 22, 10, 8, 10, 4, 43, 254, 112, 0, 16, 22, 10, 8, 10, 4, 43, 254, 116, 0, 16, 22, 10, 8, 10, 4, 43, 254, 128, 0, 16, 22, 10, 8, 10, 4, 43, 254, 136, 0, 16, 22, 10, 8, 10, 4, 43, 254, 140, 0, 16, 22, 10, 8, 10, 4, 43, 254, 144, 0, 16, 22, 10, 8, 10, 4, 43, 254, 148, 0, 16, 22, 10, 8, 10, 4, 43, 254, 152, 0, 16, 22, 10, 8, 10, 4, 43, 254, 156, 0, 16, 22, 10, 8, 10, 4, 43, 254, 168, 0, 16, 22, 10, 8, 10, 4, 43, 254, 172, 0, 16, 22, 10, 8, 10, 4, 43, 254, 180, 0, 16, 22, 10, 8, 10, 4, 43, 254, 184, 0, 16, 22, 10, 8, 10, 4, 43, 254, 188, 0, 16, 22, 10, 8, 10, 4, 43, 254, 192, 0, 16, 22, 10, 8, 10, 4, 43, 254, 196, 0, 16, 22, 10, 8, 10, 4, 43, 254, 200, 0, 16, 22, 10, 8, 10, 4, 43, 254, 208, 0, 16, 22, 10, 8, 10, 4, 43, 254, 220, 0, 16, 22, 10, 8, 10, 4, 43, 254, 224, 0, 16, 22, 10, 8, 10, 4, 43, 254, 228, 0, 16, 22, 10, 8, 10, 4, 43, 254, 232, 0, 16, 22, 10, 8, 10, 4, 43, 254, 236, 0, 16, 22, 10, 8, 10, 4, 43, 254, 240, 0, 16, 22, 10, 8, 10, 4, 43, 254, 248, 0, 16, 22, 10, 8, 10, 4, 43, 254, 252, 0, 16, 22, 10, 8, 10, 4, 43, 255, 0, 0, 16, 22, 10, 8, 10, 4, 43, 255, 4, 0, 16, 22, 10, 8, 10, 4, 43, 255, 8, 0, 16, 22, 10, 8, 10, 4, 43, 255, 16, 0, 16, 22, 10, 8, 10, 4, 43, 255, 48, 0, 16, 22, 10, 8, 10, 4, 43, 255, 64, 0, 16, 22, 10, 8, 10, 4, 43, 255, 68, 0, 16, 22, 10, 8, 10, 4, 43, 255, 72, 0, 16, 22, 10, 8, 10, 4, 43, 255, 76, 0, 16, 22, 10, 8, 10, 4, 43, 255, 84, 0, 16, 22, 10, 8, 10, 4, 43, 255, 96, 0, 16, 22, 10, 8, 10, 4, 43, 255, 108, 0, 16, 22, 10, 8, 10, 4, 43, 255, 144, 0, 16, 22, 10, 8, 10, 4, 43, 255, 168, 0, 16, 22, 10, 8, 10, 4, 43, 255, 176, 0, 16, 22, 10, 8, 10, 4, 43, 255, 184, 0, 16, 22, 10, 8, 10, 4, 43, 255, 192, 0, 16, 22, 10, 8, 10, 4, 43, 255, 200, 0, 16, 22, 10, 8, 10, 4, 43, 255, 204, 0, 16, 22, 10, 8, 10, 4, 43, 255, 208, 0, 16, 22, 10, 8, 10, 4, 43, 255, 212, 0, 16, 22, 10, 8, 10, 4, 43, 255, 224, 0, 16, 22, 10, 8, 10, 4, 43, 255, 228, 0, 16, 22, 10, 8, 10, 4, 43, 255, 232, 0, 16, 22, 10, 8, 10, 4, 43, 255, 244, 0, 16, 22, 10, 8, 10, 4, 45, 40, 192, 0, 16, 18, 10, 8, 10, 4, 45, 65, 16, 0, 16, 22, 10, 8, 10, 4, 45, 65, 20, 0, 16, 22, 10, 8, 10, 4, 45, 65, 24, 0, 16, 22, 10, 8, 10, 4, 45, 65, 28, 0, 16, 22, 10, 8, 10, 4, 45, 112, 132, 0, 16, 22, 10, 8, 10, 4, 45, 112, 188, 0, 16, 22, 10, 8, 10, 4, 45, 112, 208, 0, 16, 22, 10, 8, 10, 4, 45, 112, 212, 0, 16, 22, 10, 8, 10, 4, 45, 112, 216, 0, 16, 22, 10, 8, 10, 4, 45, 112, 220, 0, 16, 22, 10, 8, 10, 4, 45, 112, 228, 0, 16, 22, 10, 8, 10, 4, 45, 112, 232, 0, 16, 22, 10, 8, 10, 4, 45, 112, 236, 0, 16, 22, 10, 8, 10, 4, 45, 113, 12, 0, 16, 22, 10, 8, 10, 4, 45, 113, 16, 0, 16, 22, 10, 8, 10, 4, 45, 113, 20, 0, 16, 22, 10, 8, 10, 4, 45, 113, 24, 0, 16, 22, 10, 8, 10, 4, 45, 113, 28, 0, 16, 22, 10, 8, 10, 4, 45, 113, 40, 0, 16, 22, 10, 8, 10, 4, 45, 113, 52, 0, 16, 22, 10, 8, 10, 4, 45, 113, 56, 0, 16, 22, 10, 8, 10, 4, 45, 113, 72, 0, 16, 22, 10, 8, 10, 4, 45, 113, 108, 0, 16, 22, 10, 8, 10, 4, 45, 113, 144, 0, 16, 22, 10, 8, 10, 4, 45, 113, 148, 0, 16, 22, 10, 8, 10, 4, 45, 113, 168, 0, 16, 22, 10, 8, 10, 4, 45, 113, 176, 0, 16, 22, 10, 8, 10, 4, 45, 113, 184, 0, 16, 22, 10, 8, 10, 4, 45, 113, 200, 0, 16, 22, 10, 8, 10, 4, 45, 113, 204, 0, 16, 22, 10, 8, 10, 4, 45, 113, 208, 0, 16, 22, 10, 8, 10, 4, 45, 113, 212, 0, 16, 22, 10, 8, 10, 4, 45, 113, 216, 0, 16, 22, 10, 8, 10, 4, 45, 113, 220, 0, 16, 22, 10, 8, 10, 4, 45, 113, 228, 0, 16, 22, 10, 8, 10, 4, 45, 113, 240, 0, 16, 22, 10, 8, 10, 4, 45, 113, 252, 0, 16, 22, 10, 8, 10, 4, 45, 114, 0, 0, 16, 22, 10, 8, 10, 4, 45, 114, 12, 0, 16, 22, 10, 8, 10, 4, 45, 114, 32, 0, 16, 22, 10, 8, 10, 4, 45, 114, 40, 0, 16, 22, 10, 8, 10, 4, 45, 114, 52, 0, 16, 22, 10, 8, 10, 4, 45, 114, 96, 0, 16, 22, 10, 8, 10, 4, 45, 114, 104, 0, 16, 22, 10, 8, 10, 4, 45, 114, 108, 0, 16, 22, 10, 8, 10, 4, 45, 114, 124, 0, 16, 22, 10, 8, 10, 4, 45, 114, 136, 0, 16, 22, 10, 8, 10, 4, 45, 114, 196, 0, 16, 22, 10, 8, 10, 4, 45, 114, 200, 0, 16, 22, 10, 8, 10, 4, 45, 114, 228, 0, 16, 22, 10, 8, 10, 4, 45, 114, 236, 0, 16, 22, 10, 8, 10, 4, 45, 114, 252, 0, 16, 22, 10, 8, 10, 4, 45, 115, 44, 0, 16, 22, 10, 8, 10, 4, 45, 115, 100, 0, 16, 22, 10, 8, 10, 4, 45, 115, 120, 0, 16, 22, 10, 8, 10, 4, 45, 115, 132, 0, 16, 22, 10, 8, 10, 4, 45, 115, 144, 0, 16, 22, 10, 8, 10, 4, 45, 115, 156, 0, 16, 22, 10, 8, 10, 4, 45, 115, 164, 0, 16, 22, 10, 8, 10, 4, 45, 115, 200, 0, 16, 22, 10, 8, 10, 4, 45, 115, 212, 0, 16, 22, 10, 8, 10, 4, 45, 115, 216, 0, 16, 22, 10, 8, 10, 4, 45, 115, 228, 0, 16, 22, 10, 8, 10, 4, 45, 115, 236, 0, 16, 22, 10, 8, 10, 4, 45, 115, 244, 0, 16, 22, 10, 8, 10, 4, 45, 115, 248, 0, 16, 22, 10, 8, 10, 4, 45, 116, 12, 0, 16, 22, 10, 8, 10, 4, 45, 116, 16, 0, 16, 22, 10, 8, 10, 4, 45, 116, 20, 0, 16, 22, 10, 8, 10, 4, 45, 116, 24, 0, 16, 22, 10, 8, 10, 4, 45, 116, 32, 0, 16, 22, 10, 8, 10, 4, 45, 116, 36, 0, 16, 22, 10, 8, 10, 4, 45, 116, 52, 0, 16, 22, 10, 8, 10, 4, 45, 116, 96, 0, 16, 22, 10, 8, 10, 4, 45, 116, 100, 0, 16, 22, 10, 8, 10, 4, 45, 116, 140, 0, 16, 22, 10, 8, 10, 4, 45, 116, 152, 0, 16, 22, 10, 8, 10, 4, 45, 116, 208, 0, 16, 22, 10, 8, 10, 4, 45, 117, 8, 0, 16, 22, 10, 8, 10, 4, 45, 117, 20, 0, 16, 22, 10, 8, 10, 4, 45, 117, 68, 0, 16, 22, 10, 8, 10, 4, 45, 117, 124, 0, 16, 22, 10, 8, 10, 4, 45, 117, 252, 0, 16, 22, 10, 8, 10, 4, 45, 119, 52, 0, 16, 22, 10, 8, 10, 4, 45, 119, 60, 0, 16, 22, 10, 8, 10, 4, 45, 119, 64, 0, 16, 22, 10, 8, 10, 4, 45, 119, 68, 0, 16, 22, 10, 8, 10, 4, 45, 119, 72, 0, 16, 22, 10, 8, 10, 4, 45, 119, 104, 0, 16, 22, 10, 8, 10, 4, 45, 119, 116, 0, 16, 22, 10, 8, 10, 4, 45, 119, 232, 0, 16, 22, 10, 8, 10, 4, 45, 120, 100, 0, 16, 22, 10, 8, 10, 4, 45, 120, 140, 0, 16, 22, 10, 8, 10, 4, 45, 120, 164, 0, 16, 22, 10, 8, 10, 4, 45, 120, 220, 0, 16, 22, 10, 8, 10, 4, 45, 120, 240, 0, 16, 22, 10, 8, 10, 4, 45, 121, 20, 0, 16, 22, 10, 8, 10, 4, 45, 121, 52, 0, 16, 22, 10, 8, 10, 4, 45, 121, 64, 0, 16, 22, 10, 8, 10, 4, 45, 121, 68, 0, 16, 22, 10, 8, 10, 4, 45, 121, 72, 0, 16, 22, 10, 8, 10, 4, 45, 121, 92, 0, 16, 22, 10, 8, 10, 4, 45, 121, 96, 0, 16, 22, 10, 8, 10, 4, 45, 121, 104, 0, 16, 22, 10, 8, 10, 4, 45, 121, 172, 0, 16, 22, 10, 8, 10, 4, 45, 121, 176, 0, 16, 22, 10, 8, 10, 4, 45, 121, 212, 0, 16, 22, 10, 8, 10, 4, 45, 121, 240, 0, 16, 22, 10, 8, 10, 4, 45, 121, 244, 0, 16, 22, 10, 8, 10, 4, 45, 121, 248, 0, 16, 22, 10, 8, 10, 4, 45, 121, 252, 0, 16, 22, 10, 8, 10, 4, 45, 122, 0, 0, 16, 22, 10, 8, 10, 4, 45, 122, 4, 0, 16, 22, 10, 8, 10, 4, 45, 122, 8, 0, 16, 22, 10, 8, 10, 4, 45, 122, 12, 0, 16, 22, 10, 8, 10, 4, 45, 122, 16, 0, 16, 22, 10, 8, 10, 4, 45, 122, 20, 0, 16, 22, 10, 8, 10, 4, 45, 122, 24, 0, 16, 22, 10, 8, 10, 4, 45, 122, 28, 0, 16, 22, 10, 8, 10, 4, 45, 122, 32, 0, 16, 22, 10, 8, 10, 4, 45, 122, 36, 0, 16, 22, 10, 8, 10, 4, 45, 122, 40, 0, 16, 22, 10, 8, 10, 4, 45, 122, 60, 0, 16, 22, 10, 8, 10, 4, 45, 122, 64, 0, 16, 22, 10, 8, 10, 4, 45, 122, 68, 0, 16, 22, 10, 8, 10, 4, 45, 122, 72, 0, 16, 22, 10, 8, 10, 4, 45, 122, 76, 0, 16, 22, 10, 8, 10, 4, 45, 122, 80, 0, 16, 22, 10, 8, 10, 4, 45, 122, 84, 0, 16, 22, 10, 8, 10, 4, 45, 122, 88, 0, 16, 22, 10, 8, 10, 4, 45, 122, 92, 0, 16, 22, 10, 8, 10, 4, 45, 122, 96, 0, 16, 21, 10, 8, 10, 4, 45, 122, 104, 0, 16, 22, 10, 8, 10, 4, 45, 122, 108, 0, 16, 22, 10, 8, 10, 4, 45, 122, 112, 0, 16, 22, 10, 8, 10, 4, 45, 122, 116, 0, 16, 22, 10, 8, 10, 4, 45, 122, 160, 0, 16, 22, 10, 8, 10, 4, 45, 122, 164, 0, 16, 22, 10, 8, 10, 4, 45, 122, 168, 0, 16, 22, 10, 8, 10, 4, 45, 122, 172, 0, 16, 22, 10, 8, 10, 4, 45, 122, 176, 0, 16, 22, 10, 8, 10, 4, 45, 122, 180, 0, 16, 22, 10, 8, 10, 4, 45, 122, 184, 0, 16, 22, 10, 8, 10, 4, 45, 122, 188, 0, 16, 22, 10, 8, 10, 4, 45, 122, 192, 0, 16, 22, 10, 8, 10, 4, 45, 122, 196, 0, 16, 22, 10, 8, 10, 4, 45, 122, 200, 0, 16, 22, 10, 8, 10, 4, 45, 122, 204, 0, 16, 22, 10, 8, 10, 4, 45, 122, 208, 0, 16, 22, 10, 8, 10, 4, 45, 122, 212, 0, 16, 22, 10, 8, 10, 4, 45, 122, 216, 0, 16, 22, 10, 8, 10, 4, 45, 123, 28, 0, 16, 22, 10, 8, 10, 4, 45, 123, 32, 0, 16, 22, 10, 8, 10, 4, 45, 123, 36, 0, 16, 22, 10, 8, 10, 4, 45, 123, 44, 0, 16, 22, 10, 8, 10, 4, 45, 123, 48, 0, 16, 22, 10, 8, 10, 4, 45, 123, 52, 0, 16, 22, 10, 8, 10, 4, 45, 123, 56, 0, 16, 22, 10, 8, 10, 4, 45, 123, 60, 0, 16, 22, 10, 8, 10, 4, 45, 123, 64, 0, 16, 22, 10, 8, 10, 4, 45, 123, 68, 0, 16, 22, 10, 8, 10, 4, 45, 123, 72, 0, 16, 22, 10, 8, 10, 4, 45, 123, 76, 0, 16, 22, 10, 8, 10, 4, 45, 123, 80, 0, 16, 22, 10, 8, 10, 4, 45, 123, 84, 0, 16, 22, 10, 8, 10, 4, 45, 123, 88, 0, 16, 22, 10, 8, 10, 4, 45, 123, 120, 0, 16, 22, 10, 8, 10, 4, 45, 123, 128, 0, 16, 22, 10, 8, 10, 4, 45, 123, 132, 0, 16, 22, 10, 8, 10, 4, 45, 123, 136, 0, 16, 22, 10, 8, 10, 4, 45, 123, 148, 0, 16, 22, 10, 8, 10, 4, 45, 123, 152, 0, 16, 22, 10, 8, 10, 4, 45, 123, 156, 0, 16, 22, 10, 8, 10, 4, 45, 123, 164, 0, 16, 22, 10, 8, 10, 4, 45, 123, 168, 0, 16, 22, 10, 8, 10, 4, 45, 123, 172, 0, 16, 22, 10, 8, 10, 4, 45, 123, 176, 0, 16, 22, 10, 8, 10, 4, 45, 123, 180, 0, 16, 22, 10, 8, 10, 4, 45, 123, 184, 0, 16, 22, 10, 8, 10, 4, 45, 123, 204, 0, 16, 22, 10, 8, 10, 4, 45, 123, 212, 0, 16, 22, 10, 8, 10, 4, 45, 123, 224, 0, 16, 22, 10, 8, 10, 4, 45, 123, 228, 0, 16, 22, 10, 8, 10, 4, 45, 123, 232, 0, 16, 22, 10, 8, 10, 4, 45, 123, 236, 0, 16, 22, 10, 8, 10, 4, 45, 123, 240, 0, 16, 22, 10, 8, 10, 4, 45, 123, 244, 0, 16, 22, 10, 8, 10, 4, 45, 123, 248, 0, 16, 22, 10, 8, 10, 4, 45, 123, 252, 0, 16, 22, 10, 8, 10, 4, 45, 124, 0, 0, 16, 22, 10, 8, 10, 4, 45, 124, 20, 0, 16, 22, 10, 8, 10, 4, 45, 124, 28, 0, 16, 22, 10, 8, 10, 4, 45, 124, 32, 0, 16, 22, 10, 8, 10, 4, 45, 124, 36, 0, 16, 22, 10, 8, 10, 4, 45, 124, 44, 0, 16, 22, 10, 8, 10, 4, 45, 124, 68, 0, 16, 22, 10, 8, 10, 4, 45, 124, 76, 0, 16, 22, 10, 8, 10, 4, 45, 124, 80, 0, 16, 22, 10, 8, 10, 4, 45, 124, 100, 0, 16, 22, 10, 8, 10, 4, 45, 124, 124, 0, 16, 22, 10, 8, 10, 4, 45, 124, 172, 0, 16, 22, 10, 8, 10, 4, 45, 124, 176, 0, 16, 22, 10, 8, 10, 4, 45, 124, 208, 0, 16, 22, 10, 8, 10, 4, 45, 124, 248, 0, 16, 22, 10, 8, 10, 4, 45, 124, 252, 0, 16, 22, 10, 8, 10, 4, 45, 125, 12, 0, 16, 22, 10, 8, 10, 4, 45, 125, 16, 0, 16, 22, 10, 8, 10, 4, 45, 125, 24, 0, 16, 22, 10, 8, 10, 4, 45, 125, 28, 0, 16, 22, 10, 8, 10, 4, 45, 125, 32, 0, 16, 22, 10, 8, 10, 4, 45, 125, 44, 0, 16, 22, 10, 8, 10, 4, 45, 125, 52, 0, 16, 22, 10, 8, 10, 4, 45, 125, 56, 0, 16, 22, 10, 8, 10, 4, 45, 125, 76, 0, 16, 22, 10, 8, 10, 4, 45, 125, 80, 0, 16, 22, 10, 8, 10, 4, 45, 125, 84, 0, 16, 22, 10, 8, 10, 4, 45, 125, 88, 0, 16, 22, 10, 8, 10, 4, 45, 125, 92, 0, 16, 22, 10, 8, 10, 4, 45, 125, 96, 0, 16, 22, 10, 8, 10, 4, 45, 125, 100, 0, 16, 22, 10, 8, 10, 4, 45, 125, 104, 0, 16, 22, 10, 8, 10, 4, 45, 125, 136, 0, 16, 22, 10, 8, 10, 4, 45, 126, 48, 0, 16, 22, 10, 8, 10, 4, 45, 126, 52, 0, 16, 22, 10, 8, 10, 4, 45, 126, 100, 0, 16, 22, 10, 8, 10, 4, 45, 126, 108, 0, 16, 22, 10, 8, 10, 4, 45, 126, 112, 0, 16, 22, 10, 8, 10, 4, 45, 126, 116, 0, 16, 22, 10, 8, 10, 4, 45, 126, 120, 0, 16, 22, 10, 8, 10, 4, 45, 126, 212, 0, 16, 22, 10, 8, 10, 4, 45, 126, 220, 0, 16, 22, 10, 8, 10, 4, 45, 127, 8, 0, 16, 22, 10, 8, 10, 4, 45, 127, 12, 0, 16, 22, 10, 8, 10, 4, 45, 127, 36, 0, 16, 22, 10, 8, 10, 4, 45, 127, 96, 0, 16, 22, 10, 8, 10, 4, 45, 127, 116, 0, 16, 22, 10, 8, 10, 4, 45, 127, 124, 0, 16, 22, 10, 8, 10, 4, 45, 127, 128, 0, 16, 22, 10, 8, 10, 4, 45, 127, 144, 0, 16, 22, 10, 8, 10, 4, 45, 127, 148, 0, 16, 22, 10, 8, 10, 4, 45, 127, 156, 0, 16, 22, 10, 8, 10, 4, 45, 127, 216, 0, 16, 22, 10, 8, 10, 4, 45, 248, 8, 0, 16, 22, 10, 8, 10, 4, 45, 248, 80, 0, 16, 22, 10, 8, 10, 4, 45, 248, 84, 0, 16, 22, 10, 8, 10, 4, 45, 248, 88, 0, 16, 22, 10, 8, 10, 4, 45, 248, 96, 0, 16, 22, 10, 8, 10, 4, 45, 248, 100, 0, 16, 22, 10, 8, 10, 4, 45, 248, 104, 0, 16, 22, 10, 8, 10, 4, 45, 248, 108, 0, 16, 22, 10, 8, 10, 4, 45, 248, 128, 0, 16, 22, 10, 8, 10, 4, 45, 248, 132, 0, 16, 22, 10, 8, 10, 4, 45, 248, 204, 0, 16, 22, 10, 8, 10, 4, 45, 248, 208, 0, 16, 22, 10, 8, 10, 4, 45, 248, 212, 0, 16, 22, 10, 8, 10, 4, 45, 248, 216, 0, 16, 22, 10, 8, 10, 4, 45, 248, 220, 0, 16, 22, 10, 8, 10, 4, 45, 248, 224, 0, 16, 22, 10, 8, 10, 4, 45, 248, 228, 0, 16, 22, 10, 8, 10, 4, 45, 248, 232, 0, 16, 22, 10, 8, 10, 4, 45, 248, 236, 0, 16, 22, 10, 8, 10, 4, 45, 248, 240, 0, 16, 22, 10, 8, 10, 4, 45, 248, 244, 0, 16, 22, 10, 8, 10, 4, 45, 248, 248, 0, 16, 22, 10, 8, 10, 4, 45, 248, 252, 0, 16, 22, 10, 8, 10, 4, 45, 249, 0, 0, 16, 22, 10, 8, 10, 4, 45, 249, 4, 0, 16, 22, 10, 8, 10, 4, 45, 249, 12, 0, 16, 22, 10, 8, 10, 4, 45, 249, 16, 0, 16, 22, 10, 8, 10, 4, 45, 249, 20, 0, 16, 22, 10, 8, 10, 4, 45, 249, 24, 0, 16, 22, 10, 8, 10, 4, 45, 249, 28, 0, 16, 22, 10, 8, 10, 4, 45, 249, 32, 0, 16, 22, 10, 8, 10, 4, 45, 249, 36, 0, 16, 22, 10, 8, 10, 4, 45, 249, 92, 0, 16, 22, 10, 8, 10, 4, 45, 249, 112, 0, 16, 22, 10, 8, 10, 4, 45, 249, 180, 0, 16, 22, 10, 8, 10, 4, 45, 249, 188, 0, 16, 22, 10, 8, 10, 4, 45, 249, 192, 0, 16, 22, 10, 8, 10, 4, 45, 249, 196, 0, 16, 22, 10, 8, 10, 4, 45, 249, 200, 0, 16, 22, 10, 8, 10, 4, 45, 249, 204, 0, 16, 22, 10, 8, 10, 4, 45, 249, 208, 0, 16, 22, 10, 8, 10, 4, 45, 249, 212, 0, 16, 22, 10, 8, 10, 4, 45, 250, 12, 0, 16, 22, 10, 8, 10, 4, 45, 250, 16, 0, 16, 22, 10, 8, 10, 4, 45, 250, 28, 0, 16, 22, 10, 8, 10, 4, 45, 250, 32, 0, 16, 22, 10, 8, 10, 4, 45, 250, 36, 0, 16, 22, 10, 8, 10, 4, 45, 250, 40, 0, 16, 22, 10, 8, 10, 4, 45, 250, 76, 0, 16, 22, 10, 8, 10, 4, 45, 250, 80, 0, 16, 22, 10, 8, 10, 4, 45, 250, 84, 0, 16, 22, 10, 8, 10, 4, 45, 250, 88, 0, 16, 22, 10, 8, 10, 4, 45, 250, 92, 0, 16, 22, 10, 8, 10, 4, 45, 250, 96, 0, 16, 22, 10, 8, 10, 4, 45, 250, 104, 0, 16, 22, 10, 8, 10, 4, 45, 250, 108, 0, 16, 22, 10, 8, 10, 4, 45, 250, 112, 0, 16, 22, 10, 8, 10, 4, 45, 250, 116, 0, 16, 22, 10, 8, 10, 4, 45, 250, 120, 0, 16, 22, 10, 8, 10, 4, 45, 250, 124, 0, 16, 22, 10, 8, 10, 4, 45, 250, 128, 0, 16, 22, 10, 8, 10, 4, 45, 250, 132, 0, 16, 22, 10, 8, 10, 4, 45, 250, 136, 0, 16, 22, 10, 8, 10, 4, 45, 250, 140, 0, 16, 22, 10, 8, 10, 4, 45, 250, 144, 0, 16, 22, 10, 8, 10, 4, 45, 250, 148, 0, 16, 22, 10, 8, 10, 4, 45, 250, 152, 0, 16, 22, 10, 8, 10, 4, 45, 250, 164, 0, 16, 22, 10, 8, 10, 4, 45, 250, 180, 0, 16, 22, 10, 8, 10, 4, 45, 250, 184, 0, 16, 22, 10, 8, 10, 4, 45, 250, 188, 0, 16, 22, 10, 8, 10, 4, 45, 250, 192, 0, 16, 22, 10, 8, 10, 4, 45, 251, 0, 0, 16, 22, 10, 8, 10, 4, 45, 251, 8, 0, 16, 22, 10, 8, 10, 4, 45, 251, 16, 0, 16, 22, 10, 8, 10, 4, 45, 251, 20, 0, 16, 22, 10, 8, 10, 4, 45, 251, 52, 0, 16, 22, 10, 8, 10, 4, 45, 251, 84, 0, 16, 22, 10, 8, 10, 4, 45, 251, 88, 0, 16, 22, 10, 8, 10, 4, 45, 251, 92, 0, 16, 22, 10, 8, 10, 4, 45, 251, 96, 0, 16, 22, 10, 8, 10, 4, 45, 251, 100, 0, 16, 22, 10, 8, 10, 4, 45, 251, 120, 0, 16, 22, 10, 8, 10, 4, 45, 251, 124, 0, 16, 22, 10, 8, 10, 4, 45, 251, 136, 0, 16, 22, 10, 8, 10, 4, 45, 251, 140, 0, 16, 22, 10, 8, 10, 4, 45, 251, 144, 0, 16, 22, 10, 8, 10, 4, 45, 251, 148, 0, 16, 22, 10, 8, 10, 4, 45, 251, 152, 0, 16, 22, 10, 8, 10, 4, 45, 251, 156, 0, 16, 22, 10, 8, 10, 4, 45, 251, 160, 0, 16, 22, 10, 8, 10, 4, 45, 251, 164, 0, 16, 22, 10, 8, 10, 4, 45, 251, 168, 0, 16, 22, 10, 8, 10, 4, 45, 251, 172, 0, 16, 22, 10, 8, 10, 4, 45, 251, 176, 0, 16, 22, 10, 8, 10, 4, 45, 251, 180, 0, 16, 22, 10, 8, 10, 4, 45, 251, 184, 0, 16, 22, 10, 8, 10, 4, 45, 251, 188, 0, 16, 22, 10, 8, 10, 4, 45, 251, 192, 0, 16, 22, 10, 8, 10, 4, 45, 251, 196, 0, 16, 22, 10, 8, 10, 4, 45, 251, 200, 0, 16, 22, 10, 8, 10, 4, 45, 251, 204, 0, 16, 22, 10, 8, 10, 4, 45, 251, 208, 0, 16, 22, 10, 8, 10, 4, 45, 251, 212, 0, 16, 22, 10, 8, 10, 4, 45, 251, 216, 0, 16, 22, 10, 8, 10, 4, 45, 251, 220, 0, 16, 22, 10, 8, 10, 4, 45, 251, 224, 0, 16, 22, 10, 8, 10, 4, 45, 252, 0, 0, 16, 22, 10, 8, 10, 4, 45, 252, 4, 0, 16, 22, 10, 8, 10, 4, 45, 252, 8, 0, 16, 22, 10, 8, 10, 4, 45, 252, 12, 0, 16, 22, 10, 8, 10, 4, 45, 252, 16, 0, 16, 22, 10, 8, 10, 4, 45, 252, 20, 0, 16, 22, 10, 8, 10, 4, 45, 252, 24, 0, 16, 22, 10, 8, 10, 4, 45, 252, 28, 0, 16, 22, 10, 8, 10, 4, 45, 252, 32, 0, 16, 22, 10, 8, 10, 4, 45, 252, 36, 0, 16, 22, 10, 8, 10, 4, 45, 252, 40, 0, 16, 22, 10, 8, 10, 4, 45, 252, 44, 0, 16, 22, 10, 8, 10, 4, 45, 252, 48, 0, 16, 22, 10, 8, 10, 4, 45, 252, 60, 0, 16, 22, 10, 8, 10, 4, 45, 252, 84, 0, 16, 22, 10, 8, 10, 4, 45, 252, 88, 0, 16, 22, 10, 8, 10, 4, 45, 252, 92, 0, 16, 22, 10, 8, 10, 4, 45, 252, 96, 0, 16, 22, 10, 8, 10, 4, 45, 252, 100, 0, 16, 22, 10, 8, 10, 4, 45, 252, 104, 0, 16, 22, 10, 8, 10, 4, 45, 252, 108, 0, 16, 22, 10, 8, 10, 4, 45, 252, 112, 0, 16, 22, 10, 8, 10, 4, 45, 252, 116, 0, 16, 22, 10, 8, 10, 4, 45, 252, 120, 0, 16, 22, 10, 8, 10, 4, 45, 252, 124, 0, 16, 22, 10, 8, 10, 4, 45, 252, 128, 0, 16, 22, 10, 8, 10, 4, 45, 252, 132, 0, 16, 22, 10, 8, 10, 4, 45, 252, 136, 0, 16, 22, 10, 8, 10, 4, 45, 252, 140, 0, 16, 22, 10, 8, 10, 4, 45, 252, 144, 0, 16, 22, 10, 8, 10, 4, 45, 252, 148, 0, 16, 22, 10, 8, 10, 4, 45, 252, 152, 0, 16, 22, 10, 8, 10, 4, 45, 252, 156, 0, 16, 22, 10, 8, 10, 4, 45, 252, 160, 0, 16, 22, 10, 8, 10, 4, 45, 252, 164, 0, 16, 22, 10, 8, 10, 4, 45, 252, 168, 0, 16, 22, 10, 8, 10, 4, 45, 252, 172, 0, 16, 22, 10, 8, 10, 4, 45, 252, 176, 0, 16, 22, 10, 8, 10, 4, 45, 252, 192, 0, 16, 22, 10, 8, 10, 4, 45, 252, 196, 0, 16, 22, 10, 8, 10, 4, 45, 252, 200, 0, 16, 22, 10, 8, 10, 4, 45, 252, 204, 0, 16, 22, 10, 8, 10, 4, 45, 252, 208, 0, 16, 22, 10, 8, 10, 4, 45, 252, 212, 0, 16, 22, 10, 8, 10, 4, 45, 252, 216, 0, 16, 22, 10, 8, 10, 4, 45, 252, 220, 0, 16, 22, 10, 8, 10, 4, 45, 252, 224, 0, 16, 22, 10, 8, 10, 4, 45, 252, 228, 0, 16, 22, 10, 8, 10, 4, 45, 252, 232, 0, 16, 22, 10, 8, 10, 4, 45, 253, 0, 0, 16, 22, 10, 8, 10, 4, 45, 253, 4, 0, 16, 22, 10, 8, 10, 4, 45, 253, 8, 0, 16, 22, 10, 8, 10, 4, 45, 253, 12, 0, 16, 22, 10, 8, 10, 4, 45, 253, 16, 0, 16, 22, 10, 8, 10, 4, 45, 253, 20, 0, 16, 22, 10, 8, 10, 4, 45, 253, 24, 0, 16, 22, 10, 8, 10, 4, 45, 253, 28, 0, 16, 22, 10, 8, 10, 4, 45, 253, 32, 0, 16, 22, 10, 8, 10, 4, 45, 253, 36, 0, 16, 22, 10, 8, 10, 4, 45, 253, 40, 0, 16, 22, 10, 8, 10, 4, 45, 253, 44, 0, 16, 22, 10, 8, 10, 4, 45, 253, 48, 0, 16, 22, 10, 8, 10, 4, 45, 253, 52, 0, 16, 22, 10, 8, 10, 4, 45, 253, 56, 0, 16, 22, 10, 8, 10, 4, 45, 253, 60, 0, 16, 22, 10, 8, 10, 4, 45, 253, 64, 0, 16, 22, 10, 8, 10, 4, 45, 253, 68, 0, 16, 22, 10, 8, 10, 4, 45, 253, 72, 0, 16, 22, 10, 8, 10, 4, 45, 253, 76, 0, 16, 22, 10, 8, 10, 4, 45, 253, 80, 0, 16, 22, 10, 8, 10, 4, 45, 253, 84, 0, 16, 22, 10, 8, 10, 4, 45, 253, 92, 0, 16, 22, 10, 8, 10, 4, 45, 253, 96, 0, 16, 22, 10, 8, 10, 4, 45, 253, 100, 0, 16, 22, 10, 8, 10, 4, 45, 253, 104, 0, 16, 22, 10, 8, 10, 4, 45, 253, 108, 0, 16, 22, 10, 8, 10, 4, 45, 253, 112, 0, 16, 22, 10, 8, 10, 4, 45, 253, 116, 0, 16, 22, 10, 8, 10, 4, 45, 253, 120, 0, 16, 22, 10, 8, 10, 4, 45, 253, 132, 0, 16, 22, 10, 8, 10, 4, 45, 253, 136, 0, 16, 22, 10, 8, 10, 4, 45, 253, 140, 0, 16, 22, 10, 8, 10, 4, 45, 253, 144, 0, 16, 22, 10, 8, 10, 4, 45, 253, 148, 0, 16, 22, 10, 8, 10, 4, 45, 253, 152, 0, 16, 22, 10, 8, 10, 4, 45, 253, 156, 0, 16, 22, 10, 8, 10, 4, 45, 253, 160, 0, 16, 22, 10, 8, 10, 4, 45, 253, 164, 0, 16, 22, 10, 8, 10, 4, 45, 253, 168, 0, 16, 22, 10, 8, 10, 4, 45, 253, 172, 0, 16, 22, 10, 8, 10, 4, 45, 253, 176, 0, 16, 22, 10, 8, 10, 4, 45, 253, 180, 0, 16, 22, 10, 8, 10, 4, 45, 253, 184, 0, 16, 22, 10, 8, 10, 4, 45, 253, 188, 0, 16, 22, 10, 8, 10, 4, 45, 253, 192, 0, 16, 22, 10, 8, 10, 4, 45, 253, 196, 0, 16, 22, 10, 8, 10, 4, 45, 253, 200, 0, 16, 22, 10, 8, 10, 4, 45, 253, 204, 0, 16, 22, 10, 8, 10, 4, 45, 253, 208, 0, 16, 22, 10, 8, 10, 4, 45, 253, 212, 0, 16, 22, 10, 8, 10, 4, 45, 253, 216, 0, 16, 22, 10, 8, 10, 4, 45, 253, 220, 0, 16, 22, 10, 8, 10, 4, 45, 253, 224, 0, 16, 22, 10, 8, 10, 4, 45, 253, 228, 0, 16, 22, 10, 8, 10, 4, 45, 253, 232, 0, 16, 22, 10, 8, 10, 4, 45, 253, 236, 0, 16, 22, 10, 8, 10, 4, 45, 253, 240, 0, 16, 22, 10, 8, 10, 4, 45, 253, 244, 0, 16, 22, 10, 8, 10, 4, 45, 253, 248, 0, 16, 22, 10, 8, 10, 4, 45, 253, 252, 0, 16, 22, 10, 8, 10, 4, 45, 254, 0, 0, 16, 22, 10, 8, 10, 4, 45, 254, 4, 0, 16, 22, 10, 8, 10, 4, 45, 254, 8, 0, 16, 22, 10, 8, 10, 4, 45, 254, 12, 0, 16, 22, 10, 8, 10, 4, 45, 254, 16, 0, 16, 22, 10, 8, 10, 4, 45, 254, 20, 0, 16, 22, 10, 8, 10, 4, 45, 254, 24, 0, 16, 22, 10, 8, 10, 4, 45, 254, 28, 0, 16, 22, 10, 8, 10, 4, 45, 254, 40, 0, 16, 22, 10, 8, 10, 4, 45, 254, 48, 0, 16, 22, 10, 8, 10, 4, 45, 254, 52, 0, 16, 22, 10, 8, 10, 4, 45, 254, 56, 0, 16, 22, 10, 8, 10, 4, 45, 254, 60, 0, 16, 22, 10, 8, 10, 4, 45, 254, 64, 0, 16, 22, 10, 8, 10, 4, 45, 254, 68, 0, 16, 22, 10, 8, 10, 4, 45, 254, 72, 0, 16, 22, 10, 8, 10, 4, 45, 254, 76, 0, 16, 22, 10, 8, 10, 4, 45, 254, 80, 0, 16, 22, 10, 8, 10, 4, 45, 254, 84, 0, 16, 22, 10, 8, 10, 4, 45, 254, 88, 0, 16, 22, 10, 8, 10, 4, 45, 254, 92, 0, 16, 22, 10, 8, 10, 4, 45, 254, 96, 0, 16, 22, 10, 8, 10, 4, 45, 254, 100, 0, 16, 22, 10, 8, 10, 4, 45, 254, 104, 0, 16, 22, 10, 8, 10, 4, 45, 254, 108, 0, 16, 22, 10, 8, 10, 4, 45, 254, 112, 0, 16, 22, 10, 8, 10, 4, 45, 254, 116, 0, 16, 22, 10, 8, 10, 4, 45, 254, 120, 0, 16, 22, 10, 8, 10, 4, 45, 254, 124, 0, 16, 22, 10, 8, 10, 4, 45, 254, 128, 0, 16, 22, 10, 8, 10, 4, 45, 254, 132, 0, 16, 22, 10, 8, 10, 4, 45, 254, 136, 0, 16, 22, 10, 8, 10, 4, 45, 254, 140, 0, 16, 22, 10, 8, 10, 4, 45, 254, 144, 0, 16, 22, 10, 8, 10, 4, 45, 254, 148, 0, 16, 22, 10, 8, 10, 4, 45, 254, 152, 0, 16, 22, 10, 8, 10, 4, 45, 254, 156, 0, 16, 22, 10, 8, 10, 4, 45, 254, 160, 0, 16, 22, 10, 8, 10, 4, 45, 254, 164, 0, 16, 22, 10, 8, 10, 4, 45, 254, 168, 0, 16, 22, 10, 8, 10, 4, 45, 254, 172, 0, 16, 22, 10, 8, 10, 4, 45, 254, 176, 0, 16, 22, 10, 8, 10, 4, 45, 254, 180, 0, 16, 22, 10, 8, 10, 4, 45, 254, 184, 0, 16, 22, 10, 8, 10, 4, 45, 254, 188, 0, 16, 22, 10, 8, 10, 4, 45, 254, 192, 0, 16, 22, 10, 8, 10, 4, 45, 254, 196, 0, 16, 22, 10, 8, 10, 4, 45, 254, 200, 0, 16, 22, 10, 8, 10, 4, 45, 254, 204, 0, 16, 22, 10, 8, 10, 4, 45, 254, 208, 0, 16, 22, 10, 8, 10, 4, 45, 254, 212, 0, 16, 22, 10, 8, 10, 4, 45, 254, 216, 0, 16, 22, 10, 8, 10, 4, 45, 254, 220, 0, 16, 22, 10, 8, 10, 4, 45, 254, 224, 0, 16, 22, 10, 8, 10, 4, 45, 254, 228, 0, 16, 22, 10, 8, 10, 4, 45, 254, 236, 0, 16, 22, 10, 8, 10, 4, 45, 254, 240, 0, 16, 22, 10, 8, 10, 4, 45, 254, 248, 0, 16, 22, 10, 8, 10, 4, 45, 255, 0, 0, 16, 22, 10, 8, 10, 4, 45, 255, 4, 0, 16, 22, 10, 8, 10, 4, 45, 255, 8, 0, 16, 22, 10, 8, 10, 4, 45, 255, 12, 0, 16, 22, 10, 8, 10, 4, 45, 255, 16, 0, 16, 22, 10, 8, 10, 4, 45, 255, 20, 0, 16, 22, 10, 8, 10, 4, 45, 255, 24, 0, 16, 22, 10, 8, 10, 4, 45, 255, 28, 0, 16, 22, 10, 8, 10, 4, 45, 255, 32, 0, 16, 22, 10, 8, 10, 4, 45, 255, 36, 0, 16, 22, 10, 8, 10, 4, 45, 255, 40, 0, 16, 22, 10, 8, 10, 4, 45, 255, 44, 0, 16, 22, 10, 8, 10, 4, 45, 255, 48, 0, 16, 22, 10, 8, 10, 4, 45, 255, 52, 0, 16, 22, 10, 8, 10, 4, 45, 255, 56, 0, 16, 22, 10, 8, 10, 4, 45, 255, 60, 0, 16, 22, 10, 8, 10, 4, 45, 255, 64, 0, 16, 22, 10, 8, 10, 4, 45, 255, 68, 0, 16, 22, 10, 8, 10, 4, 45, 255, 72, 0, 16, 22, 10, 8, 10, 4, 45, 255, 76, 0, 16, 22, 10, 8, 10, 4, 45, 255, 80, 0, 16, 22, 10, 8, 10, 4, 45, 255, 84, 0, 16, 22, 10, 8, 10, 4, 45, 255, 88, 0, 16, 22, 10, 8, 10, 4, 45, 255, 92, 0, 16, 22, 10, 8, 10, 4, 45, 255, 96, 0, 16, 22, 10, 8, 10, 4, 45, 255, 100, 0, 16, 22, 10, 8, 10, 4, 45, 255, 104, 0, 16, 22, 10, 8, 10, 4, 45, 255, 108, 0, 16, 22, 10, 8, 10, 4, 45, 255, 112, 0, 16, 22, 10, 8, 10, 4, 45, 255, 116, 0, 16, 22, 10, 8, 10, 4, 45, 255, 120, 0, 16, 22, 10, 8, 10, 4, 45, 255, 124, 0, 16, 22, 10, 8, 10, 4, 45, 255, 132, 0, 16, 22, 10, 8, 10, 4, 45, 255, 136, 0, 16, 22, 10, 8, 10, 4, 45, 255, 140, 0, 16, 22, 10, 8, 10, 4, 45, 255, 144, 0, 16, 22, 10, 8, 10, 4, 45, 255, 148, 0, 16, 22, 10, 8, 10, 4, 45, 255, 152, 0, 16, 22, 10, 8, 10, 4, 45, 255, 156, 0, 16, 22, 10, 8, 10, 4, 45, 255, 160, 0, 16, 22, 10, 8, 10, 4, 45, 255, 164, 0, 16, 22, 10, 8, 10, 4, 45, 255, 168, 0, 16, 22, 10, 8, 10, 4, 45, 255, 172, 0, 16, 22, 10, 8, 10, 4, 45, 255, 176, 0, 16, 22, 10, 8, 10, 4, 45, 255, 180, 0, 16, 22, 10, 8, 10, 4, 45, 255, 184, 0, 16, 22, 10, 8, 10, 4, 45, 255, 188, 0, 16, 22, 10, 8, 10, 4, 45, 255, 192, 0, 16, 22, 10, 8, 10, 4, 45, 255, 196, 0, 16, 22, 10, 8, 10, 4, 45, 255, 200, 0, 16, 22, 10, 8, 10, 4, 45, 255, 204, 0, 16, 22, 10, 8, 10, 4, 45, 255, 208, 0, 16, 22, 10, 8, 10, 4, 45, 255, 212, 0, 16, 22, 10, 8, 10, 4, 45, 255, 216, 0, 16, 22, 10, 8, 10, 4, 45, 255, 220, 0, 16, 22, 10, 8, 10, 4, 45, 255, 224, 0, 16, 22, 10, 8, 10, 4, 45, 255, 228, 0, 16, 22, 10, 8, 10, 4, 45, 255, 232, 0, 16, 22, 10, 8, 10, 4, 45, 255, 236, 0, 16, 22, 10, 8, 10, 4, 45, 255, 240, 0, 16, 22, 10, 8, 10, 4, 45, 255, 244, 0, 16, 22, 10, 8, 10, 4, 45, 255, 248, 0, 16, 22, 10, 8, 10, 4, 47, 92, 0, 0, 16, 14, 10, 8, 10, 4, 47, 96, 0, 0, 16, 11, 10, 8, 10, 4, 49, 4, 0, 0, 16, 14, 10, 8, 10, 4, 49, 51, 0, 0, 16, 16, 10, 8, 10, 4, 49, 52, 0, 0, 16, 14, 10, 8, 10, 4, 49, 64, 0, 0, 16, 11, 10, 8, 10, 4, 49, 112, 0, 0, 16, 13, 10, 8, 10, 4, 49, 120, 0, 0, 16, 14, 10, 8, 10, 4, 49, 128, 0, 0, 16, 24, 10, 8, 10, 4, 49, 128, 2, 0, 16, 23, 10, 8, 10, 4, 49, 128, 4, 0, 16, 22, 10, 8, 10, 4, 49, 140, 0, 0, 16, 15, 10, 8, 10, 4, 49, 152, 0, 0, 16, 14, 10, 8, 10, 4, 49, 208, 0, 0, 16, 15, 10, 8, 10, 4, 49, 210, 0, 0, 16, 15, 10, 8, 10, 4, 49, 220, 0, 0, 16, 14, 10, 8, 10, 4, 49, 232, 0, 0, 16, 14, 10, 8, 10, 4, 49, 239, 0, 0, 16, 18, 10, 8, 10, 4, 49, 239, 192, 0, 16, 18, 10, 8, 10, 4, 49, 246, 224, 0, 16, 19, 10, 8, 10, 4, 52, 80, 0, 0, 16, 16, 10, 8, 10, 4, 52, 81, 0, 0, 16, 16, 10, 8, 10, 4, 52, 82, 0, 0, 16, 15, 10, 8, 10, 4, 54, 222, 0, 0, 16, 15, 10, 8, 10, 4, 58, 14, 0, 0, 16, 15, 10, 8, 10, 4, 58, 16, 0, 0, 16, 16, 10, 8, 10, 4, 58, 17, 0, 0, 16, 17, 10, 8, 10, 4, 58, 17, 128, 0, 16, 17, 10, 8, 10, 4, 58, 18, 0, 0, 16, 16, 10, 8, 10, 4, 58, 19, 0, 0, 16, 16, 10, 8, 10, 4, 58, 20, 0, 0, 16, 16, 10, 8, 10, 4, 58, 21, 0, 0, 16, 16, 10, 8, 10, 4, 58, 22, 0, 0, 16, 15, 10, 8, 10, 4, 58, 24, 0, 0, 16, 15, 10, 8, 10, 4, 58, 30, 0, 0, 16, 15, 10, 8, 10, 4, 58, 32, 0, 0, 16, 13, 10, 8, 10, 4, 58, 40, 0, 0, 16, 15, 10, 8, 10, 4, 58, 42, 0, 0, 16, 16, 10, 8, 10, 4, 58, 43, 0, 0, 16, 16, 10, 8, 10, 4, 58, 44, 0, 0, 16, 14, 10, 8, 10, 4, 58, 48, 0, 0, 16, 13, 10, 8, 10, 4, 58, 56, 0, 0, 16, 15, 10, 8, 10, 4, 58, 58, 0, 0, 16, 16, 10, 8, 10, 4, 58, 59, 0, 0, 16, 17, 10, 8, 10, 4, 58, 59, 128, 0, 16, 17, 10, 8, 10, 4, 58, 60, 0, 0, 16, 14, 10, 8, 10, 4, 58, 65, 232, 0, 16, 21, 10, 8, 10, 4, 58, 66, 0, 0, 16, 15, 10, 8, 10, 4, 58, 68, 128, 0, 16, 17, 10, 8, 10, 4, 58, 82, 0, 0, 16, 17, 10, 8, 10, 4, 58, 83, 0, 0, 16, 17, 10, 8, 10, 4, 58, 83, 128, 0, 16, 17, 10, 8, 10, 4, 58, 87, 64, 0, 16, 18, 10, 8, 10, 4, 58, 99, 128, 0, 16, 17, 10, 8, 10, 4, 58, 100, 0, 0, 16, 15, 10, 8, 10, 4, 58, 116, 0, 0, 16, 14, 10, 8, 10, 4, 58, 128, 0, 0, 16, 13, 10, 8, 10, 4, 58, 144, 0, 0, 16, 16, 10, 8, 10, 4, 58, 154, 0, 0, 16, 15, 10, 8, 10, 4, 58, 192, 0, 0, 16, 15, 10, 8, 10, 4, 58, 194, 0, 0, 16, 15, 10, 8, 10, 4, 58, 196, 0, 0, 16, 15, 10, 8, 10, 4, 58, 198, 0, 0, 16, 15, 10, 8, 10, 4, 58, 200, 0, 0, 16, 13, 10, 8, 10, 4, 58, 208, 0, 0, 16, 12, 10, 8, 10, 4, 58, 240, 0, 0, 16, 15, 10, 8, 10, 4, 58, 242, 0, 0, 16, 15, 10, 8, 10, 4, 58, 244, 0, 0, 16, 15, 10, 8, 10, 4, 58, 246, 0, 0, 16, 15, 10, 8, 10, 4, 58, 248, 0, 0, 16, 13, 10, 8, 10, 4, 59, 32, 0, 0, 16, 13, 10, 8, 10, 4, 59, 40, 0, 0, 16, 15, 10, 8, 10, 4, 59, 42, 0, 0, 16, 16, 10, 8, 10, 4, 59, 43, 0, 0, 16, 16, 10, 8, 10, 4, 59, 44, 0, 0, 16, 14, 10, 8, 10, 4, 59, 48, 0, 0, 16, 16, 10, 8, 10, 4, 59, 49, 0, 0, 16, 17, 10, 8, 10, 4, 59, 49, 128, 0, 16, 17, 10, 8, 10, 4, 59, 50, 0, 0, 16, 16, 10, 8, 10, 4, 59, 51, 0, 0, 16, 17, 10, 8, 10, 4, 59, 51, 128, 0, 16, 17, 10, 8, 10, 4, 59, 52, 0, 0, 16, 14, 10, 8, 10, 4, 59, 56, 0, 0, 16, 14, 10, 8, 10, 4, 59, 60, 0, 0, 16, 15, 10, 8, 10, 4, 59, 62, 0, 0, 16, 15, 10, 8, 10, 4, 59, 64, 0, 0, 16, 14, 10, 8, 10, 4, 59, 68, 0, 0, 16, 14, 10, 8, 10, 4, 59, 72, 0, 0, 16, 15, 10, 8, 10, 4, 59, 74, 0, 0, 16, 15, 10, 8, 10, 4, 59, 76, 0, 0, 16, 16, 10, 8, 10, 4, 59, 77, 0, 0, 16, 16, 10, 8, 10, 4, 59, 78, 0, 0, 16, 15, 10, 8, 10, 4, 59, 80, 0, 0, 16, 15, 10, 8, 10, 4, 59, 82, 0, 0, 16, 15, 10, 8, 10, 4, 59, 107, 0, 0, 16, 17, 10, 8, 10, 4, 59, 107, 128, 0, 16, 17, 10, 8, 10, 4, 59, 108, 0, 0, 16, 15, 10, 8, 10, 4, 59, 110, 0, 0, 16, 15, 10, 8, 10, 4, 59, 151, 0, 0, 16, 17, 10, 8, 10, 4, 59, 152, 16, 0, 16, 22, 10, 8, 10, 4, 59, 152, 20, 0, 16, 22, 10, 8, 10, 4, 59, 152, 24, 0, 16, 22, 10, 8, 10, 4, 59, 152, 28, 0, 16, 22, 10, 8, 10, 4, 59, 152, 32, 0, 16, 22, 10, 8, 10, 4, 59, 152, 36, 0, 16, 22, 10, 8, 10, 4, 59, 152, 64, 0, 16, 22, 10, 8, 10, 4, 59, 152, 68, 0, 16, 22, 10, 8, 10, 4, 59, 152, 72, 0, 16, 22, 10, 8, 10, 4, 59, 152, 76, 0, 16, 22, 10, 8, 10, 4, 59, 152, 112, 0, 16, 22, 10, 8, 10, 4, 59, 152, 116, 0, 16, 22, 10, 8, 10, 4, 59, 153, 4, 0, 16, 22, 10, 8, 10, 4, 59, 153, 32, 0, 16, 22, 10, 8, 10, 4, 59, 153, 60, 0, 16, 22, 10, 8, 10, 4, 59, 153, 64, 0, 16, 22, 10, 8, 10, 4, 59, 153, 68, 0, 16, 22, 10, 8, 10, 4, 59, 153, 72, 0, 16, 22, 10, 8, 10, 4, 59, 153, 92, 0, 16, 22, 10, 8, 10, 4, 59, 153, 116, 0, 16, 22, 10, 8, 10, 4, 59, 153, 136, 0, 16, 22, 10, 8, 10, 4, 59, 153, 152, 0, 16, 22, 10, 8, 10, 4, 59, 153, 156, 0, 16, 22, 10, 8, 10, 4, 59, 153, 164, 0, 16, 22, 10, 8, 10, 4, 59, 153, 168, 0, 16, 22, 10, 8, 10, 4, 59, 153, 172, 0, 16, 22, 10, 8, 10, 4, 59, 153, 176, 0, 16, 22, 10, 8, 10, 4, 59, 153, 180, 0, 16, 22, 10, 8, 10, 4, 59, 153, 184, 0, 16, 22, 10, 8, 10, 4, 59, 153, 188, 0, 16, 22, 10, 8, 10, 4, 59, 153, 192, 0, 16, 22, 10, 8, 10, 4, 59, 155, 0, 0, 16, 16, 10, 8, 10, 4, 59, 172, 0, 0, 16, 15, 10, 8, 10, 4, 59, 174, 0, 0, 16, 15, 10, 8, 10, 4, 59, 191, 0, 0, 16, 17, 10, 8, 10, 4, 59, 191, 240, 0, 16, 20, 10, 8, 10, 4, 59, 192, 0, 0, 16, 10, 10, 8, 10, 4, 60, 0, 0, 0, 16, 13, 10, 8, 10, 4, 60, 8, 0, 0, 16, 15, 10, 8, 10, 4, 60, 10, 0, 0, 16, 16, 10, 8, 10, 4, 60, 11, 0, 0, 16, 16, 10, 8, 10, 4, 60, 12, 0, 0, 16, 16, 10, 8, 10, 4, 60, 13, 0, 0, 16, 18, 10, 8, 10, 4, 60, 13, 64, 0, 16, 18, 10, 8, 10, 4, 60, 13, 128, 0, 16, 17, 10, 8, 10, 4, 60, 14, 0, 0, 16, 15, 10, 8, 10, 4, 60, 16, 0, 0, 16, 13, 10, 8, 10, 4, 60, 24, 0, 0, 16, 14, 10, 8, 10, 4, 60, 28, 0, 0, 16, 15, 10, 8, 10, 4, 60, 30, 0, 0, 16, 16, 10, 8, 10, 4, 60, 31, 0, 0, 16, 16, 10, 8, 10, 4, 60, 55, 0, 0, 16, 16, 10, 8, 10, 4, 60, 63, 0, 0, 16, 16, 10, 8, 10, 4, 60, 160, 0, 0, 16, 15, 10, 8, 10, 4, 60, 162, 0, 0, 16, 15, 10, 8, 10, 4, 60, 164, 0, 0, 16, 15, 10, 8, 10, 4, 60, 166, 0, 0, 16, 15, 10, 8, 10, 4, 60, 168, 0, 0, 16, 13, 10, 8, 10, 4, 60, 176, 0, 0, 16, 12, 10, 8, 10, 4, 60, 194, 0, 0, 16, 15, 10, 8, 10, 4, 60, 200, 0, 0, 16, 14, 10, 8, 10, 4, 60, 204, 0, 0, 16, 16, 10, 8, 10, 4, 60, 205, 0, 0, 16, 16, 10, 8, 10, 4, 60, 206, 0, 0, 16, 15, 10, 8, 10, 4, 60, 208, 0, 0, 16, 13, 10, 8, 10, 4, 60, 216, 0, 0, 16, 15, 10, 8, 10, 4, 60, 218, 0, 0, 16, 15, 10, 8, 10, 4, 60, 220, 0, 0, 16, 14, 10, 8, 10, 4, 60, 232, 0, 0, 16, 15, 10, 8, 10, 4, 60, 235, 0, 0, 16, 16, 10, 8, 10, 4, 60, 245, 128, 0, 16, 17, 10, 8, 10, 4, 60, 247, 0, 0, 16, 16, 10, 8, 10, 4, 60, 252, 0, 0, 16, 16, 10, 8, 10, 4, 60, 253, 128, 0, 16, 17, 10, 8, 10, 4, 60, 255, 0, 0, 16, 16, 10, 8, 10, 4, 61, 4, 80, 0, 16, 22, 10, 8, 10, 4, 61, 4, 84, 0, 16, 22, 10, 8, 10, 4, 61, 4, 88, 0, 16, 21, 10, 8, 10, 4, 61, 4, 176, 0, 16, 20, 10, 8, 10, 4, 61, 8, 160, 0, 16, 20, 10, 8, 10, 4, 61, 14, 212, 0, 16, 22, 10, 8, 10, 4, 61, 14, 216, 0, 16, 22, 10, 8, 10, 4, 61, 14, 220, 0, 16, 22, 10, 8, 10, 4, 61, 14, 240, 0, 16, 22, 10, 8, 10, 4, 61, 14, 244, 0, 16, 22, 10, 8, 10, 4, 61, 28, 0, 0, 16, 20, 10, 8, 10, 4, 61, 28, 16, 0, 16, 20, 10, 8, 10, 4, 61, 28, 32, 0, 16, 19, 10, 8, 10, 4, 61, 28, 64, 0, 16, 18, 10, 8, 10, 4, 61, 29, 128, 0, 16, 18, 10, 8, 10, 4, 61, 29, 192, 0, 16, 19, 10, 8, 10, 4, 61, 29, 224, 0, 16, 20, 10, 8, 10, 4, 61, 29, 240, 0, 16, 20, 10, 8, 10, 4, 61, 45, 128, 0, 16, 18, 10, 8, 10, 4, 61, 45, 224, 0, 16, 20, 10, 8, 10, 4, 61, 47, 128, 0, 16, 18, 10, 8, 10, 4, 61, 48, 0, 0, 16, 14, 10, 8, 10, 4, 61, 52, 0, 0, 16, 15, 10, 8, 10, 4, 61, 54, 0, 0, 16, 16, 10, 8, 10, 4, 61, 55, 0, 0, 16, 16, 10, 8, 10, 4, 61, 87, 192, 0, 16, 18, 10, 8, 10, 4, 61, 128, 0, 0, 16, 15, 10, 8, 10, 4, 61, 130, 0, 0, 16, 15, 10, 8, 10, 4, 61, 132, 0, 0, 16, 16, 10, 8, 10, 4, 61, 133, 0, 0, 16, 17, 10, 8, 10, 4, 61, 133, 128, 0, 16, 17, 10, 8, 10, 4, 61, 134, 0, 0, 16, 18, 10, 8, 10, 4, 61, 134, 64, 0, 16, 19, 10, 8, 10, 4, 61, 134, 96, 0, 16, 19, 10, 8, 10, 4, 61, 134, 128, 0, 16, 18, 10, 8, 10, 4, 61, 134, 192, 0, 16, 18, 10, 8, 10, 4, 61, 135, 0, 0, 16, 16, 10, 8, 10, 4, 61, 136, 0, 0, 16, 18, 10, 8, 10, 4, 61, 136, 64, 0, 16, 18, 10, 8, 10, 4, 61, 136, 128, 0, 16, 17, 10, 8, 10, 4, 61, 137, 0, 0, 16, 17, 10, 8, 10, 4, 61, 137, 128, 0, 16, 17, 10, 8, 10, 4, 61, 138, 0, 0, 16, 18, 10, 8, 10, 4, 61, 138, 64, 0, 16, 18, 10, 8, 10, 4, 61, 138, 128, 0, 16, 18, 10, 8, 10, 4, 61, 138, 192, 0, 16, 18, 10, 8, 10, 4, 61, 139, 0, 0, 16, 17, 10, 8, 10, 4, 61, 139, 128, 0, 16, 18, 10, 8, 10, 4, 61, 139, 192, 0, 16, 18, 10, 8, 10, 4, 61, 140, 0, 0, 16, 14, 10, 8, 10, 4, 61, 144, 0, 0, 16, 14, 10, 8, 10, 4, 61, 148, 0, 0, 16, 15, 10, 8, 10, 4, 61, 150, 0, 0, 16, 15, 10, 8, 10, 4, 61, 152, 0, 0, 16, 16, 10, 8, 10, 4, 61, 153, 0, 0, 16, 16, 10, 8, 10, 4, 61, 154, 0, 0, 16, 15, 10, 8, 10, 4, 61, 156, 0, 0, 16, 16, 10, 8, 10, 4, 61, 157, 0, 0, 16, 16, 10, 8, 10, 4, 61, 158, 0, 0, 16, 17, 10, 8, 10, 4, 61, 158, 128, 0, 16, 17, 10, 8, 10, 4, 61, 159, 0, 0, 16, 18, 10, 8, 10, 4, 61, 159, 64, 0, 16, 18, 10, 8, 10, 4, 61, 159, 128, 0, 16, 17, 10, 8, 10, 4, 61, 160, 0, 0, 16, 16, 10, 8, 10, 4, 61, 161, 0, 0, 16, 18, 10, 8, 10, 4, 61, 161, 64, 0, 16, 18, 10, 8, 10, 4, 61, 161, 128, 0, 16, 17, 10, 8, 10, 4, 61, 162, 0, 0, 16, 16, 10, 8, 10, 4, 61, 163, 0, 0, 16, 16, 10, 8, 10, 4, 61, 164, 0, 0, 16, 16, 10, 8, 10, 4, 61, 165, 0, 0, 16, 16, 10, 8, 10, 4, 61, 166, 0, 0, 16, 16, 10, 8, 10, 4, 61, 167, 0, 0, 16, 16, 10, 8, 10, 4, 61, 168, 0, 0, 16, 16, 10, 8, 10, 4, 61, 169, 0, 0, 16, 16, 10, 8, 10, 4, 61, 170, 0, 0, 16, 15, 10, 8, 10, 4, 61, 172, 0, 0, 16, 14, 10, 8, 10, 4, 61, 176, 0, 0, 16, 16, 10, 8, 10, 4, 61, 177, 0, 0, 16, 16, 10, 8, 10, 4, 61, 178, 0, 0, 16, 16, 10, 8, 10, 4, 61, 179, 0, 0, 16, 16, 10, 8, 10, 4, 61, 180, 0, 0, 16, 17, 10, 8, 10, 4, 61, 180, 128, 0, 16, 17, 10, 8, 10, 4, 61, 181, 0, 0, 16, 16, 10, 8, 10, 4, 61, 182, 0, 0, 16, 16, 10, 8, 10, 4, 61, 183, 0, 0, 16, 16, 10, 8, 10, 4, 61, 184, 0, 0, 16, 14, 10, 8, 10, 4, 61, 188, 0, 0, 16, 16, 10, 8, 10, 4, 61, 189, 0, 0, 16, 17, 10, 8, 10, 4, 61, 189, 128, 0, 16, 17, 10, 8, 10, 4, 61, 190, 0, 0, 16, 15, 10, 8, 10, 4, 61, 232, 0, 0, 16, 14, 10, 8, 10, 4, 61, 236, 0, 0, 16, 15, 10, 8, 10, 4, 61, 240, 0, 0, 16, 14, 10, 8, 10, 4, 62, 234, 0, 0, 16, 16, 10, 8, 10, 4, 94, 191, 0, 0, 16, 17, 10, 8, 10, 4, 101, 0, 0, 0, 16, 22, 10, 8, 10, 4, 101, 1, 0, 0, 16, 22, 10, 8, 10, 4, 101, 2, 172, 0, 16, 22, 10, 8, 10, 4, 101, 4, 0, 0, 16, 14, 10, 8, 10, 4, 101, 16, 0, 0, 16, 12, 10, 8, 10, 4, 101, 32, 0, 0, 16, 14, 10, 8, 10, 4, 101, 36, 0, 0, 16, 17, 10, 8, 10, 4, 101, 36, 128, 0, 16, 17, 10, 8, 10, 4, 101, 37, 0, 0, 16, 16, 10, 8, 10, 4, 101, 38, 0, 0, 16, 15, 10, 8, 10, 4, 101, 40, 0, 0, 16, 13, 10, 8, 10, 4, 101, 48, 0, 0, 16, 15, 10, 8, 10, 4, 101, 50, 8, 0, 16, 22, 10, 8, 10, 4, 101, 50, 12, 0, 16, 22, 10, 8, 10, 4, 101, 50, 56, 0, 16, 22, 10, 8, 10, 4, 101, 52, 0, 0, 16, 16, 10, 8, 10, 4, 101, 53, 100, 0, 16, 22, 10, 8, 10, 4, 101, 54, 0, 0, 16, 16, 10, 8, 10, 4, 101, 55, 224, 0, 16, 21, 10, 8, 10, 4, 101, 64, 0, 0, 16, 13, 10, 8, 10, 4, 101, 72, 0, 0, 16, 14, 10, 8, 10, 4, 101, 76, 0, 0, 16, 15, 10, 8, 10, 4, 101, 78, 0, 0, 16, 22, 10, 8, 10, 4, 101, 78, 32, 0, 16, 19, 10, 8, 10, 4, 101, 80, 0, 0, 16, 12, 10, 8, 10, 4, 101, 96, 0, 0, 16, 21, 10, 8, 10, 4, 101, 96, 8, 0, 16, 22, 10, 8, 10, 4, 101, 96, 16, 0, 16, 20, 10, 8, 10, 4, 101, 96, 128, 0, 16, 17, 10, 8, 10, 4, 101, 99, 96, 0, 16, 19, 10, 8, 10, 4, 101, 101, 64, 0, 16, 19, 10, 8, 10, 4, 101, 101, 100, 0, 16, 24, 10, 8, 10, 4, 101, 101, 102, 0, 16, 23, 10, 8, 10, 4, 101, 101, 104, 0, 16, 21, 10, 8, 10, 4, 101, 101, 112, 0, 16, 20, 10, 8, 10, 4, 101, 102, 64, 0, 16, 19, 10, 8, 10, 4, 101, 102, 100, 0, 16, 23, 10, 8, 10, 4, 101, 102, 102, 0, 16, 24, 10, 8, 10, 4, 101, 102, 104, 0, 16, 21, 10, 8, 10, 4, 101, 102, 112, 0, 16, 20, 10, 8, 10, 4, 101, 104, 0, 0, 16, 14, 10, 8, 10, 4, 101, 110, 64, 0, 16, 19, 10, 8, 10, 4, 101, 110, 96, 0, 16, 20, 10, 8, 10, 4, 101, 110, 116, 0, 16, 22, 10, 8, 10, 4, 101, 110, 120, 0, 16, 21, 10, 8, 10, 4, 101, 120, 0, 0, 16, 14, 10, 8, 10, 4, 101, 124, 0, 0, 16, 15, 10, 8, 10, 4, 101, 126, 0, 0, 16, 16, 10, 8, 10, 4, 101, 128, 0, 0, 16, 22, 10, 8, 10, 4, 101, 128, 8, 0, 16, 21, 10, 8, 10, 4, 101, 128, 16, 0, 16, 20, 10, 8, 10, 4, 101, 128, 32, 0, 16, 19, 10, 8, 10, 4, 101, 129, 0, 0, 16, 16, 10, 8, 10, 4, 101, 130, 0, 0, 16, 15, 10, 8, 10, 4, 101, 132, 0, 0, 16, 14, 10, 8, 10, 4, 101, 144, 0, 0, 16, 12, 10, 8, 10, 4, 101, 192, 0, 0, 16, 14, 10, 8, 10, 4, 101, 196, 0, 0, 16, 14, 10, 8, 10, 4, 101, 200, 0, 0, 16, 15, 10, 8, 10, 4, 101, 203, 128, 0, 16, 19, 10, 8, 10, 4, 101, 203, 160, 0, 16, 21, 10, 8, 10, 4, 101, 203, 172, 0, 16, 22, 10, 8, 10, 4, 101, 203, 176, 0, 16, 20, 10, 8, 10, 4, 101, 204, 0, 0, 16, 14, 10, 8, 10, 4, 101, 224, 0, 0, 16, 13, 10, 8, 10, 4, 101, 232, 0, 0, 16, 15, 10, 8, 10, 4, 101, 234, 64, 0, 16, 21, 10, 8, 10, 4, 101, 234, 76, 0, 16, 22, 10, 8, 10, 4, 101, 234, 80, 0, 16, 20, 10, 8, 10, 4, 101, 234, 96, 0, 16, 19, 10, 8, 10, 4, 101, 236, 0, 0, 16, 14, 10, 8, 10, 4, 101, 240, 0, 0, 16, 14, 10, 8, 10, 4, 101, 244, 0, 0, 16, 14, 10, 8, 10, 4, 101, 248, 0, 0, 16, 15, 10, 8, 10, 4, 101, 251, 0, 0, 16, 22, 10, 8, 10, 4, 101, 251, 8, 0, 16, 21, 10, 8, 10, 4, 101, 251, 16, 0, 16, 20, 10, 8, 10, 4, 101, 251, 32, 0, 16, 19, 10, 8, 10, 4, 101, 251, 64, 0, 16, 18, 10, 8, 10, 4, 101, 251, 128, 0, 16, 17, 10, 8, 10, 4, 101, 252, 0, 0, 16, 15, 10, 8, 10, 4, 101, 254, 0, 0, 16, 16, 10, 8, 10, 4, 103, 1, 8, 0, 16, 22, 10, 8, 10, 4, 103, 1, 20, 0, 16, 22, 10, 8, 10, 4, 103, 1, 24, 0, 16, 22, 10, 8, 10, 4, 103, 1, 72, 0, 16, 22, 10, 8, 10, 4, 103, 1, 88, 0, 16, 22, 10, 8, 10, 4, 103, 1, 168, 0, 16, 22, 10, 8, 10, 4, 103, 2, 108, 0, 16, 22, 10, 8, 10, 4, 103, 2, 156, 0, 16, 22, 10, 8, 10, 4, 103, 2, 164, 0, 16, 22, 10, 8, 10, 4, 103, 2, 200, 0, 16, 22, 10, 8, 10, 4, 103, 2, 204, 0, 16, 22, 10, 8, 10, 4, 103, 2, 208, 0, 16, 22, 10, 8, 10, 4, 103, 2, 212, 0, 16, 22, 10, 8, 10, 4, 103, 3, 84, 0, 16, 22, 10, 8, 10, 4, 103, 3, 88, 0, 16, 22, 10, 8, 10, 4, 103, 3, 92, 0, 16, 22, 10, 8, 10, 4, 103, 3, 96, 0, 16, 22, 10, 8, 10, 4, 103, 3, 100, 0, 16, 22, 10, 8, 10, 4, 103, 3, 104, 0, 16, 22, 10, 8, 10, 4, 103, 3, 108, 0, 16, 22, 10, 8, 10, 4, 103, 3, 112, 0, 16, 22, 10, 8, 10, 4, 103, 3, 116, 0, 16, 22, 10, 8, 10, 4, 103, 3, 120, 0, 16, 22, 10, 8, 10, 4, 103, 3, 124, 0, 16, 22, 10, 8, 10, 4, 103, 3, 128, 0, 16, 22, 10, 8, 10, 4, 103, 3, 132, 0, 16, 22, 10, 8, 10, 4, 103, 3, 136, 0, 16, 22, 10, 8, 10, 4, 103, 3, 140, 0, 16, 22, 10, 8, 10, 4, 103, 3, 148, 0, 16, 22, 10, 8, 10, 4, 103, 3, 152, 0, 16, 22, 10, 8, 10, 4, 103, 3, 156, 0, 16, 22, 10, 8, 10, 4, 103, 4, 56, 0, 16, 22, 10, 8, 10, 4, 103, 4, 168, 0, 16, 22, 10, 8, 10, 4, 103, 4, 184, 0, 16, 22, 10, 8, 10, 4, 103, 4, 224, 0, 16, 22, 10, 8, 10, 4, 103, 5, 36, 0, 16, 22, 10, 8, 10, 4, 103, 5, 52, 0, 16, 22, 10, 8, 10, 4, 103, 5, 56, 0, 16, 22, 10, 8, 10, 4, 103, 5, 152, 0, 16, 22, 10, 8, 10, 4, 103, 5, 168, 0, 16, 22, 10, 8, 10, 4, 103, 5, 192, 0, 16, 22, 10, 8, 10, 4, 103, 5, 252, 0, 16, 22, 10, 8, 10, 4, 103, 6, 76, 0, 16, 22, 10, 8, 10, 4, 103, 6, 108, 0, 16, 22, 10, 8, 10, 4, 103, 6, 220, 0, 16, 22, 10, 8, 10, 4, 103, 6, 228, 0, 16, 22, 10, 8, 10, 4, 103, 7, 4, 0, 16, 22, 10, 8, 10, 4, 103, 7, 28, 0, 16, 22, 10, 8, 10, 4, 103, 7, 140, 0, 16, 22, 10, 8, 10, 4, 103, 7, 212, 0, 16, 22, 10, 8, 10, 4, 103, 7, 216, 0, 16, 22, 10, 8, 10, 4, 103, 7, 220, 0, 16, 22, 10, 8, 10, 4, 103, 8, 0, 0, 16, 22, 10, 8, 10, 4, 103, 8, 4, 0, 16, 22, 10, 8, 10, 4, 103, 8, 8, 0, 16, 22, 10, 8, 10, 4, 103, 8, 32, 0, 16, 22, 10, 8, 10, 4, 103, 8, 52, 0, 16, 22, 10, 8, 10, 4, 103, 8, 68, 0, 16, 22, 10, 8, 10, 4, 103, 8, 108, 0, 16, 22, 10, 8, 10, 4, 103, 8, 156, 0, 16, 22, 10, 8, 10, 4, 103, 8, 200, 0, 16, 22, 10, 8, 10, 4, 103, 8, 204, 0, 16, 22, 10, 8, 10, 4, 103, 8, 220, 0, 16, 22, 10, 8, 10, 4, 103, 9, 8, 0, 16, 22, 10, 8, 10, 4, 103, 9, 24, 0, 16, 22, 10, 8, 10, 4, 103, 9, 108, 0, 16, 22, 10, 8, 10, 4, 103, 9, 152, 0, 16, 22, 10, 8, 10, 4, 103, 9, 192, 0, 16, 22, 10, 8, 10, 4, 103, 9, 248, 0, 16, 22, 10, 8, 10, 4, 103, 9, 252, 0, 16, 22, 10, 8, 10, 4, 103, 10, 0, 0, 16, 22, 10, 8, 10, 4, 103, 10, 16, 0, 16, 22, 10, 8, 10, 4, 103, 10, 84, 0, 16, 22, 10, 8, 10, 4, 103, 10, 140, 0, 16, 22, 10, 8, 10, 4, 103, 11, 16, 0, 16, 22, 10, 8, 10, 4, 103, 11, 168, 0, 16, 22, 10, 8, 10, 4, 103, 11, 180, 0, 16, 22, 10, 8, 10, 4, 103, 12, 32, 0, 16, 22, 10, 8, 10, 4, 103, 12, 68, 0, 16, 22, 10, 8, 10, 4, 103, 12, 92, 0, 16, 22, 10, 8, 10, 4, 103, 12, 136, 0, 16, 22, 10, 8, 10, 4, 103, 12, 184, 0, 16, 22, 10, 8, 10, 4, 103, 12, 232, 0, 16, 22, 10, 8, 10, 4, 103, 13, 12, 0, 16, 22, 10, 8, 10, 4, 103, 13, 72, 0, 16, 23, 10, 8, 10, 4, 103, 13, 124, 0, 16, 22, 10, 8, 10, 4, 103, 13, 144, 0, 16, 22, 10, 8, 10, 4, 103, 13, 196, 0, 16, 22, 10, 8, 10, 4, 103, 13, 220, 0, 16, 22, 10, 8, 10, 4, 103, 13, 244, 0, 16, 22, 10, 8, 10, 4, 103, 14, 32, 0, 16, 22, 10, 8, 10, 4, 103, 14, 84, 0, 16, 22, 10, 8, 10, 4, 103, 14, 100, 0, 16, 22, 10, 8, 10, 4, 103, 14, 112, 0, 16, 22, 10, 8, 10, 4, 103, 14, 132, 0, 16, 22, 10, 8, 10, 4, 103, 14, 136, 0, 16, 22, 10, 8, 10, 4, 103, 14, 156, 0, 16, 22, 10, 8, 10, 4, 103, 14, 240, 0, 16, 22, 10, 8, 10, 4, 103, 15, 4, 0, 16, 22, 10, 8, 10, 4, 103, 15, 8, 0, 16, 22, 10, 8, 10, 4, 103, 15, 16, 0, 16, 22, 10, 8, 10, 4, 103, 15, 96, 0, 16, 22, 10, 8, 10, 4, 103, 15, 200, 0, 16, 22, 10, 8, 10, 4, 103, 16, 52, 0, 16, 22, 10, 8, 10, 4, 103, 16, 80, 0, 16, 22, 10, 8, 10, 4, 103, 16, 84, 0, 16, 22, 10, 8, 10, 4, 103, 16, 88, 0, 16, 22, 10, 8, 10, 4, 103, 16, 108, 0, 16, 22, 10, 8, 10, 4, 103, 16, 124, 0, 16, 22, 10, 8, 10, 4, 103, 17, 40, 0, 16, 22, 10, 8, 10, 4, 103, 17, 64, 0, 16, 22, 10, 8, 10, 4, 103, 17, 120, 0, 16, 22, 10, 8, 10, 4, 103, 17, 136, 0, 16, 22, 10, 8, 10, 4, 103, 17, 160, 0, 16, 22, 10, 8, 10, 4, 103, 17, 204, 0, 16, 22, 10, 8, 10, 4, 103, 17, 228, 0, 16, 22, 10, 8, 10, 4, 103, 18, 192, 0, 16, 22, 10, 8, 10, 4, 103, 18, 208, 0, 16, 22, 10, 8, 10, 4, 103, 18, 212, 0, 16, 22, 10, 8, 10, 4, 103, 18, 224, 0, 16, 22, 10, 8, 10, 4, 103, 19, 0, 0, 16, 22, 10, 8, 10, 4, 103, 19, 12, 0, 16, 22, 10, 8, 10, 4, 103, 19, 40, 0, 16, 22, 10, 8, 10, 4, 103, 19, 44, 0, 16, 22, 10, 8, 10, 4, 103, 19, 64, 0, 16, 22, 10, 8, 10, 4, 103, 19, 68, 0, 16, 22, 10, 8, 10, 4, 103, 19, 72, 0, 16, 22, 10, 8, 10, 4, 103, 19, 232, 0, 16, 22, 10, 8, 10, 4, 103, 20, 12, 0, 16, 22, 10, 8, 10, 4, 103, 20, 32, 0, 16, 22, 10, 8, 10, 4, 103, 20, 44, 0, 16, 22, 10, 8, 10, 4, 103, 20, 68, 0, 16, 22, 10, 8, 10, 4, 103, 20, 112, 0, 16, 22, 10, 8, 10, 4, 103, 20, 128, 0, 16, 22, 10, 8, 10, 4, 103, 20, 160, 0, 16, 22, 10, 8, 10, 4, 103, 20, 248, 0, 16, 22, 10, 8, 10, 4, 103, 21, 112, 0, 16, 22, 10, 8, 10, 4, 103, 21, 116, 0, 16, 22, 10, 8, 10, 4, 103, 21, 136, 0, 16, 22, 10, 8, 10, 4, 103, 21, 140, 0, 16, 22, 10, 8, 10, 4, 103, 21, 176, 0, 16, 22, 10, 8, 10, 4, 103, 21, 208, 0, 16, 22, 10, 8, 10, 4, 103, 21, 240, 0, 16, 22, 10, 8, 10, 4, 103, 22, 0, 0, 16, 22, 10, 8, 10, 4, 103, 22, 4, 0, 16, 22, 10, 8, 10, 4, 103, 22, 8, 0, 16, 22, 10, 8, 10, 4, 103, 22, 12, 0, 16, 22, 10, 8, 10, 4, 103, 22, 16, 0, 16, 22, 10, 8, 10, 4, 103, 22, 20, 0, 16, 22, 10, 8, 10, 4, 103, 22, 24, 0, 16, 22, 10, 8, 10, 4, 103, 22, 28, 0, 16, 22, 10, 8, 10, 4, 103, 22, 32, 0, 16, 22, 10, 8, 10, 4, 103, 22, 36, 0, 16, 22, 10, 8, 10, 4, 103, 22, 40, 0, 16, 22, 10, 8, 10, 4, 103, 22, 44, 0, 16, 22, 10, 8, 10, 4, 103, 22, 48, 0, 16, 22, 10, 8, 10, 4, 103, 22, 52, 0, 16, 22, 10, 8, 10, 4, 103, 22, 56, 0, 16, 22, 10, 8, 10, 4, 103, 22, 60, 0, 16, 22, 10, 8, 10, 4, 103, 22, 64, 0, 16, 22, 10, 8, 10, 4, 103, 22, 68, 0, 16, 22, 10, 8, 10, 4, 103, 22, 72, 0, 16, 22, 10, 8, 10, 4, 103, 22, 76, 0, 16, 22, 10, 8, 10, 4, 103, 22, 80, 0, 16, 22, 10, 8, 10, 4, 103, 22, 84, 0, 16, 22, 10, 8, 10, 4, 103, 22, 88, 0, 16, 22, 10, 8, 10, 4, 103, 22, 92, 0, 16, 22, 10, 8, 10, 4, 103, 22, 100, 0, 16, 22, 10, 8, 10, 4, 103, 22, 104, 0, 16, 22, 10, 8, 10, 4, 103, 22, 108, 0, 16, 22, 10, 8, 10, 4, 103, 22, 112, 0, 16, 22, 10, 8, 10, 4, 103, 22, 116, 0, 16, 22, 10, 8, 10, 4, 103, 22, 120, 0, 16, 22, 10, 8, 10, 4, 103, 22, 124, 0, 16, 22, 10, 8, 10, 4, 103, 22, 188, 0, 16, 22, 10, 8, 10, 4, 103, 22, 228, 0, 16, 22, 10, 8, 10, 4, 103, 22, 252, 0, 16, 22, 10, 8, 10, 4, 103, 23, 8, 0, 16, 22, 10, 8, 10, 4, 103, 23, 56, 0, 16, 22, 10, 8, 10, 4, 103, 23, 160, 0, 16, 22, 10, 8, 10, 4, 103, 23, 164, 0, 16, 22, 10, 8, 10, 4, 103, 23, 176, 0, 16, 22, 10, 8, 10, 4, 103, 23, 228, 0, 16, 22, 10, 8, 10, 4, 103, 24, 24, 0, 16, 22, 10, 8, 10, 4, 103, 24, 116, 0, 16, 22, 10, 8, 10, 4, 103, 24, 128, 0, 16, 22, 10, 8, 10, 4, 103, 24, 144, 0, 16, 22, 10, 8, 10, 4, 103, 24, 176, 0, 16, 22, 10, 8, 10, 4, 103, 24, 184, 0, 16, 22, 10, 8, 10, 4, 103, 24, 220, 0, 16, 22, 10, 8, 10, 4, 103, 24, 228, 0, 16, 22, 10, 8, 10, 4, 103, 24, 248, 0, 16, 22, 10, 8, 10, 4, 103, 24, 252, 0, 16, 22, 10, 8, 10, 4, 103, 25, 8, 0, 16, 23, 10, 8, 10, 4, 103, 25, 20, 0, 16, 22, 10, 8, 10, 4, 103, 25, 24, 0, 16, 22, 10, 8, 10, 4, 103, 25, 28, 0, 16, 22, 10, 8, 10, 4, 103, 25, 32, 0, 16, 22, 10, 8, 10, 4, 103, 25, 36, 0, 16, 22, 10, 8, 10, 4, 103, 25, 40, 0, 16, 22, 10, 8, 10, 4, 103, 25, 48, 0, 16, 22, 10, 8, 10, 4, 103, 25, 64, 0, 16, 22, 10, 8, 10, 4, 103, 25, 68, 0, 16, 22, 10, 8, 10, 4, 103, 25, 148, 0, 16, 22, 10, 8, 10, 4, 103, 25, 156, 0, 16, 22, 10, 8, 10, 4, 103, 25, 216, 0, 16, 22, 10, 8, 10, 4, 103, 26, 0, 0, 16, 22, 10, 8, 10, 4, 103, 26, 64, 0, 16, 22, 10, 8, 10, 4, 103, 26, 76, 0, 16, 22, 10, 8, 10, 4, 103, 26, 116, 0, 16, 22, 10, 8, 10, 4, 103, 26, 132, 0, 16, 22, 10, 8, 10, 4, 103, 26, 156, 0, 16, 22, 10, 8, 10, 4, 103, 26, 160, 0, 16, 22, 10, 8, 10, 4, 103, 26, 228, 0, 16, 22, 10, 8, 10, 4, 103, 26, 240, 0, 16, 22, 10, 8, 10, 4, 103, 27, 4, 0, 16, 22, 10, 8, 10, 4, 103, 27, 12, 0, 16, 22, 10, 8, 10, 4, 103, 27, 24, 0, 16, 22, 10, 8, 10, 4, 103, 27, 56, 0, 16, 22, 10, 8, 10, 4, 103, 27, 96, 0, 16, 22, 10, 8, 10, 4, 103, 27, 184, 0, 16, 22, 10, 8, 10, 4, 103, 27, 208, 0, 16, 22, 10, 8, 10, 4, 103, 27, 212, 0, 16, 22, 10, 8, 10, 4, 103, 27, 240, 0, 16, 22, 10, 8, 10, 4, 103, 28, 4, 0, 16, 22, 10, 8, 10, 4, 103, 28, 8, 0, 16, 22, 10, 8, 10, 4, 103, 28, 184, 0, 16, 22, 10, 8, 10, 4, 103, 28, 204, 0, 16, 22, 10, 8, 10, 4, 103, 28, 212, 0, 16, 22, 10, 8, 10, 4, 103, 29, 16, 0, 16, 22, 10, 8, 10, 4, 103, 29, 128, 0, 16, 22, 10, 8, 10, 4, 103, 29, 132, 0, 16, 22, 10, 8, 10, 4, 103, 29, 136, 0, 16, 22, 10, 8, 10, 4, 103, 30, 20, 0, 16, 22, 10, 8, 10, 4, 103, 30, 96, 0, 16, 22, 10, 8, 10, 4, 103, 30, 148, 0, 16, 22, 10, 8, 10, 4, 103, 30, 200, 0, 16, 22, 10, 8, 10, 4, 103, 30, 228, 0, 16, 22, 10, 8, 10, 4, 103, 30, 236, 0, 16, 22, 10, 8, 10, 4, 103, 31, 0, 0, 16, 22, 10, 8, 10, 4, 103, 31, 48, 0, 16, 22, 10, 8, 10, 4, 103, 31, 52, 0, 16, 22, 10, 8, 10, 4, 103, 31, 56, 0, 16, 22, 10, 8, 10, 4, 103, 31, 60, 0, 16, 22, 10, 8, 10, 4, 103, 31, 64, 0, 16, 22, 10, 8, 10, 4, 103, 31, 68, 0, 16, 22, 10, 8, 10, 4, 103, 31, 148, 0, 16, 22, 10, 8, 10, 4, 103, 31, 160, 0, 16, 22, 10, 8, 10, 4, 103, 31, 168, 0, 16, 22, 10, 8, 10, 4, 103, 31, 200, 0, 16, 22, 10, 8, 10, 4, 103, 31, 236, 0, 16, 22, 10, 8, 10, 4, 103, 32, 0, 0, 16, 22, 10, 8, 10, 4, 103, 32, 4, 0, 16, 22, 10, 8, 10, 4, 103, 32, 8, 0, 16, 22, 10, 8, 10, 4, 103, 32, 12, 0, 16, 22, 10, 8, 10, 4, 103, 32, 16, 0, 16, 22, 10, 8, 10, 4, 103, 32, 20, 0, 16, 22, 10, 8, 10, 4, 103, 32, 24, 0, 16, 22, 10, 8, 10, 4, 103, 32, 28, 0, 16, 22, 10, 8, 10, 4, 103, 32, 32, 0, 16, 22, 10, 8, 10, 4, 103, 32, 36, 0, 16, 22, 10, 8, 10, 4, 103, 32, 40, 0, 16, 22, 10, 8, 10, 4, 103, 32, 44, 0, 16, 22, 10, 8, 10, 4, 103, 32, 48, 0, 16, 22, 10, 8, 10, 4, 103, 32, 52, 0, 16, 22, 10, 8, 10, 4, 103, 32, 56, 0, 16, 22, 10, 8, 10, 4, 103, 32, 60, 0, 16, 22, 10, 8, 10, 4, 103, 32, 64, 0, 16, 22, 10, 8, 10, 4, 103, 32, 68, 0, 16, 22, 10, 8, 10, 4, 103, 32, 72, 0, 16, 22, 10, 8, 10, 4, 103, 32, 76, 0, 16, 22, 10, 8, 10, 4, 103, 32, 80, 0, 16, 22, 10, 8, 10, 4, 103, 32, 84, 0, 16, 22, 10, 8, 10, 4, 103, 32, 88, 0, 16, 22, 10, 8, 10, 4, 103, 32, 92, 0, 16, 22, 10, 8, 10, 4, 103, 32, 96, 0, 16, 22, 10, 8, 10, 4, 103, 32, 100, 0, 16, 22, 10, 8, 10, 4, 103, 32, 104, 0, 16, 22, 10, 8, 10, 4, 103, 32, 108, 0, 16, 22, 10, 8, 10, 4, 103, 32, 112, 0, 16, 22, 10, 8, 10, 4, 103, 32, 116, 0, 16, 22, 10, 8, 10, 4, 103, 32, 120, 0, 16, 22, 10, 8, 10, 4, 103, 32, 124, 0, 16, 22, 10, 8, 10, 4, 103, 32, 128, 0, 16, 22, 10, 8, 10, 4, 103, 32, 132, 0, 16, 22, 10, 8, 10, 4, 103, 32, 136, 0, 16, 22, 10, 8, 10, 4, 103, 32, 140, 0, 16, 22, 10, 8, 10, 4, 103, 32, 144, 0, 16, 22, 10, 8, 10, 4, 103, 32, 148, 0, 16, 22, 10, 8, 10, 4, 103, 32, 152, 0, 16, 22, 10, 8, 10, 4, 103, 32, 156, 0, 16, 22, 10, 8, 10, 4, 103, 32, 160, 0, 16, 22, 10, 8, 10, 4, 103, 32, 164, 0, 16, 22, 10, 8, 10, 4, 103, 32, 168, 0, 16, 22, 10, 8, 10, 4, 103, 32, 172, 0, 16, 22, 10, 8, 10, 4, 103, 32, 176, 0, 16, 22, 10, 8, 10, 4, 103, 32, 180, 0, 16, 22, 10, 8, 10, 4, 103, 32, 184, 0, 16, 22, 10, 8, 10, 4, 103, 32, 188, 0, 16, 22, 10, 8, 10, 4, 103, 32, 192, 0, 16, 22, 10, 8, 10, 4, 103, 32, 196, 0, 16, 22, 10, 8, 10, 4, 103, 32, 200, 0, 16, 22, 10, 8, 10, 4, 103, 32, 204, 0, 16, 22, 10, 8, 10, 4, 103, 32, 208, 0, 16, 22, 10, 8, 10, 4, 103, 32, 212, 0, 16, 22, 10, 8, 10, 4, 103, 32, 216, 0, 16, 22, 10, 8, 10, 4, 103, 32, 220, 0, 16, 22, 10, 8, 10, 4, 103, 32, 224, 0, 16, 22, 10, 8, 10, 4, 103, 32, 228, 0, 16, 22, 10, 8, 10, 4, 103, 32, 232, 0, 16, 22, 10, 8, 10, 4, 103, 32, 236, 0, 16, 22, 10, 8, 10, 4, 103, 32, 240, 0, 16, 22, 10, 8, 10, 4, 103, 32, 244, 0, 16, 22, 10, 8, 10, 4, 103, 32, 248, 0, 16, 22, 10, 8, 10, 4, 103, 32, 252, 0, 16, 22, 10, 8, 10, 4, 103, 33, 0, 0, 16, 22, 10, 8, 10, 4, 103, 33, 4, 0, 16, 22, 10, 8, 10, 4, 103, 33, 8, 0, 16, 22, 10, 8, 10, 4, 103, 33, 12, 0, 16, 22, 10, 8, 10, 4, 103, 33, 16, 0, 16, 22, 10, 8, 10, 4, 103, 33, 20, 0, 16, 22, 10, 8, 10, 4, 103, 33, 24, 0, 16, 22, 10, 8, 10, 4, 103, 33, 28, 0, 16, 22, 10, 8, 10, 4, 103, 33, 32, 0, 16, 22, 10, 8, 10, 4, 103, 33, 36, 0, 16, 22, 10, 8, 10, 4, 103, 33, 40, 0, 16, 22, 10, 8, 10, 4, 103, 33, 44, 0, 16, 22, 10, 8, 10, 4, 103, 33, 48, 0, 16, 22, 10, 8, 10, 4, 103, 33, 52, 0, 16, 22, 10, 8, 10, 4, 103, 33, 56, 0, 16, 22, 10, 8, 10, 4, 103, 33, 60, 0, 16, 22, 10, 8, 10, 4, 103, 33, 64, 0, 16, 22, 10, 8, 10, 4, 103, 33, 68, 0, 16, 22, 10, 8, 10, 4, 103, 33, 72, 0, 16, 22, 10, 8, 10, 4, 103, 33, 76, 0, 16, 22, 10, 8, 10, 4, 103, 33, 80, 0, 16, 22, 10, 8, 10, 4, 103, 33, 84, 0, 16, 22, 10, 8, 10, 4, 103, 33, 88, 0, 16, 22, 10, 8, 10, 4, 103, 33, 92, 0, 16, 22, 10, 8, 10, 4, 103, 33, 96, 0, 16, 22, 10, 8, 10, 4, 103, 33, 100, 0, 16, 22, 10, 8, 10, 4, 103, 33, 104, 0, 16, 22, 10, 8, 10, 4, 103, 33, 108, 0, 16, 22, 10, 8, 10, 4, 103, 33, 112, 0, 16, 22, 10, 8, 10, 4, 103, 33, 116, 0, 16, 22, 10, 8, 10, 4, 103, 33, 120, 0, 16, 22, 10, 8, 10, 4, 103, 33, 124, 0, 16, 22, 10, 8, 10, 4, 103, 33, 128, 0, 16, 22, 10, 8, 10, 4, 103, 33, 132, 0, 16, 22, 10, 8, 10, 4, 103, 33, 136, 0, 16, 22, 10, 8, 10, 4, 103, 33, 140, 0, 16, 22, 10, 8, 10, 4, 103, 33, 144, 0, 16, 22, 10, 8, 10, 4, 103, 33, 148, 0, 16, 22, 10, 8, 10, 4, 103, 33, 152, 0, 16, 22, 10, 8, 10, 4, 103, 33, 156, 0, 16, 22, 10, 8, 10, 4, 103, 33, 160, 0, 16, 22, 10, 8, 10, 4, 103, 33, 164, 0, 16, 22, 10, 8, 10, 4, 103, 33, 168, 0, 16, 22, 10, 8, 10, 4, 103, 33, 172, 0, 16, 22, 10, 8, 10, 4, 103, 33, 176, 0, 16, 22, 10, 8, 10, 4, 103, 33, 180, 0, 16, 22, 10, 8, 10, 4, 103, 33, 184, 0, 16, 22, 10, 8, 10, 4, 103, 33, 188, 0, 16, 22, 10, 8, 10, 4, 103, 33, 192, 0, 16, 22, 10, 8, 10, 4, 103, 33, 196, 0, 16, 22, 10, 8, 10, 4, 103, 33, 200, 0, 16, 22, 10, 8, 10, 4, 103, 33, 204, 0, 16, 22, 10, 8, 10, 4, 103, 33, 208, 0, 16, 22, 10, 8, 10, 4, 103, 33, 212, 0, 16, 22, 10, 8, 10, 4, 103, 33, 216, 0, 16, 22, 10, 8, 10, 4, 103, 33, 220, 0, 16, 22, 10, 8, 10, 4, 103, 33, 224, 0, 16, 22, 10, 8, 10, 4, 103, 33, 228, 0, 16, 22, 10, 8, 10, 4, 103, 33, 232, 0, 16, 22, 10, 8, 10, 4, 103, 33, 236, 0, 16, 22, 10, 8, 10, 4, 103, 33, 240, 0, 16, 22, 10, 8, 10, 4, 103, 33, 244, 0, 16, 22, 10, 8, 10, 4, 103, 33, 248, 0, 16, 22, 10, 8, 10, 4, 103, 33, 252, 0, 16, 22, 10, 8, 10, 4, 103, 34, 0, 0, 16, 22, 10, 8, 10, 4, 103, 34, 4, 0, 16, 22, 10, 8, 10, 4, 103, 34, 8, 0, 16, 22, 10, 8, 10, 4, 103, 34, 12, 0, 16, 22, 10, 8, 10, 4, 103, 34, 16, 0, 16, 22, 10, 8, 10, 4, 103, 34, 20, 0, 16, 22, 10, 8, 10, 4, 103, 34, 24, 0, 16, 22, 10, 8, 10, 4, 103, 34, 28, 0, 16, 22, 10, 8, 10, 4, 103, 34, 32, 0, 16, 22, 10, 8, 10, 4, 103, 34, 36, 0, 16, 22, 10, 8, 10, 4, 103, 34, 40, 0, 16, 22, 10, 8, 10, 4, 103, 34, 44, 0, 16, 22, 10, 8, 10, 4, 103, 34, 48, 0, 16, 22, 10, 8, 10, 4, 103, 34, 52, 0, 16, 22, 10, 8, 10, 4, 103, 34, 56, 0, 16, 22, 10, 8, 10, 4, 103, 34, 60, 0, 16, 22, 10, 8, 10, 4, 103, 34, 64, 0, 16, 22, 10, 8, 10, 4, 103, 34, 68, 0, 16, 22, 10, 8, 10, 4, 103, 34, 72, 0, 16, 22, 10, 8, 10, 4, 103, 34, 76, 0, 16, 22, 10, 8, 10, 4, 103, 34, 80, 0, 16, 22, 10, 8, 10, 4, 103, 34, 84, 0, 16, 22, 10, 8, 10, 4, 103, 34, 88, 0, 16, 22, 10, 8, 10, 4, 103, 34, 92, 0, 16, 22, 10, 8, 10, 4, 103, 34, 96, 0, 16, 22, 10, 8, 10, 4, 103, 34, 100, 0, 16, 22, 10, 8, 10, 4, 103, 34, 104, 0, 16, 22, 10, 8, 10, 4, 103, 34, 108, 0, 16, 22, 10, 8, 10, 4, 103, 34, 112, 0, 16, 22, 10, 8, 10, 4, 103, 34, 116, 0, 16, 22, 10, 8, 10, 4, 103, 34, 120, 0, 16, 22, 10, 8, 10, 4, 103, 34, 124, 0, 16, 22, 10, 8, 10, 4, 103, 34, 128, 0, 16, 22, 10, 8, 10, 4, 103, 34, 132, 0, 16, 22, 10, 8, 10, 4, 103, 34, 136, 0, 16, 22, 10, 8, 10, 4, 103, 34, 140, 0, 16, 22, 10, 8, 10, 4, 103, 34, 144, 0, 16, 22, 10, 8, 10, 4, 103, 34, 148, 0, 16, 22, 10, 8, 10, 4, 103, 34, 152, 0, 16, 22, 10, 8, 10, 4, 103, 34, 156, 0, 16, 22, 10, 8, 10, 4, 103, 34, 160, 0, 16, 22, 10, 8, 10, 4, 103, 34, 164, 0, 16, 22, 10, 8, 10, 4, 103, 34, 168, 0, 16, 22, 10, 8, 10, 4, 103, 34, 172, 0, 16, 22, 10, 8, 10, 4, 103, 34, 176, 0, 16, 22, 10, 8, 10, 4, 103, 34, 180, 0, 16, 22, 10, 8, 10, 4, 103, 34, 184, 0, 16, 22, 10, 8, 10, 4, 103, 34, 188, 0, 16, 22, 10, 8, 10, 4, 103, 34, 192, 0, 16, 22, 10, 8, 10, 4, 103, 34, 196, 0, 16, 22, 10, 8, 10, 4, 103, 34, 200, 0, 16, 22, 10, 8, 10, 4, 103, 34, 204, 0, 16, 22, 10, 8, 10, 4, 103, 34, 208, 0, 16, 22, 10, 8, 10, 4, 103, 34, 212, 0, 16, 22, 10, 8, 10, 4, 103, 34, 216, 0, 16, 22, 10, 8, 10, 4, 103, 34, 220, 0, 16, 22, 10, 8, 10, 4, 103, 34, 224, 0, 16, 22, 10, 8, 10, 4, 103, 34, 228, 0, 16, 22, 10, 8, 10, 4, 103, 34, 232, 0, 16, 22, 10, 8, 10, 4, 103, 34, 236, 0, 16, 22, 10, 8, 10, 4, 103, 34, 240, 0, 16, 22, 10, 8, 10, 4, 103, 34, 244, 0, 16, 22, 10, 8, 10, 4, 103, 34, 248, 0, 16, 22, 10, 8, 10, 4, 103, 34, 252, 0, 16, 22, 10, 8, 10, 4, 103, 35, 0, 0, 16, 22, 10, 8, 10, 4, 103, 35, 4, 0, 16, 22, 10, 8, 10, 4, 103, 35, 8, 0, 16, 22, 10, 8, 10, 4, 103, 35, 12, 0, 16, 22, 10, 8, 10, 4, 103, 35, 16, 0, 16, 22, 10, 8, 10, 4, 103, 35, 20, 0, 16, 22, 10, 8, 10, 4, 103, 35, 24, 0, 16, 22, 10, 8, 10, 4, 103, 35, 28, 0, 16, 22, 10, 8, 10, 4, 103, 35, 32, 0, 16, 22, 10, 8, 10, 4, 103, 35, 36, 0, 16, 22, 10, 8, 10, 4, 103, 35, 40, 0, 16, 22, 10, 8, 10, 4, 103, 35, 44, 0, 16, 22, 10, 8, 10, 4, 103, 35, 48, 0, 16, 22, 10, 8, 10, 4, 103, 35, 104, 0, 16, 22, 10, 8, 10, 4, 103, 35, 116, 0, 16, 22, 10, 8, 10, 4, 103, 35, 180, 0, 16, 22, 10, 8, 10, 4, 103, 35, 200, 0, 16, 22, 10, 8, 10, 4, 103, 35, 220, 0, 16, 22, 10, 8, 10, 4, 103, 36, 20, 0, 16, 22, 10, 8, 10, 4, 103, 36, 28, 0, 16, 22, 10, 8, 10, 4, 103, 36, 36, 0, 16, 22, 10, 8, 10, 4, 103, 36, 56, 0, 16, 22, 10, 8, 10, 4, 103, 36, 60, 0, 16, 22, 10, 8, 10, 4, 103, 36, 64, 0, 16, 22, 10, 8, 10, 4, 103, 36, 72, 0, 16, 22, 10, 8, 10, 4, 103, 36, 96, 0, 16, 22, 10, 8, 10, 4, 103, 36, 132, 0, 16, 22, 10, 8, 10, 4, 103, 36, 136, 0, 16, 22, 10, 8, 10, 4, 103, 36, 160, 0, 16, 22, 10, 8, 10, 4, 103, 36, 164, 0, 16, 22, 10, 8, 10, 4, 103, 36, 168, 0, 16, 22, 10, 8, 10, 4, 103, 36, 172, 0, 16, 22, 10, 8, 10, 4, 103, 36, 176, 0, 16, 22, 10, 8, 10, 4, 103, 36, 180, 0, 16, 22, 10, 8, 10, 4, 103, 36, 184, 0, 16, 22, 10, 8, 10, 4, 103, 36, 188, 0, 16, 22, 10, 8, 10, 4, 103, 36, 192, 0, 16, 22, 10, 8, 10, 4, 103, 36, 196, 0, 16, 22, 10, 8, 10, 4, 103, 36, 200, 0, 16, 22, 10, 8, 10, 4, 103, 36, 204, 0, 16, 22, 10, 8, 10, 4, 103, 36, 208, 0, 16, 22, 10, 8, 10, 4, 103, 36, 212, 0, 16, 22, 10, 8, 10, 4, 103, 36, 216, 0, 16, 22, 10, 8, 10, 4, 103, 36, 220, 0, 16, 22, 10, 8, 10, 4, 103, 36, 224, 0, 16, 22, 10, 8, 10, 4, 103, 36, 228, 0, 16, 22, 10, 8, 10, 4, 103, 36, 232, 0, 16, 22, 10, 8, 10, 4, 103, 36, 236, 0, 16, 22, 10, 8, 10, 4, 103, 36, 240, 0, 16, 22, 10, 8, 10, 4, 103, 36, 244, 0, 16, 22, 10, 8, 10, 4, 103, 37, 0, 0, 16, 22, 10, 8, 10, 4, 103, 37, 12, 0, 16, 22, 10, 8, 10, 4, 103, 37, 16, 0, 16, 22, 10, 8, 10, 4, 103, 37, 24, 0, 16, 22, 10, 8, 10, 4, 103, 37, 44, 0, 16, 22, 10, 8, 10, 4, 103, 37, 52, 0, 16, 22, 10, 8, 10, 4, 103, 37, 56, 0, 16, 22, 10, 8, 10, 4, 103, 37, 72, 0, 16, 22, 10, 8, 10, 4, 103, 37, 100, 0, 16, 22, 10, 8, 10, 4, 103, 37, 104, 0, 16, 22, 10, 8, 10, 4, 103, 37, 124, 0, 16, 22, 10, 8, 10, 4, 103, 37, 136, 0, 16, 22, 10, 8, 10, 4, 103, 37, 140, 0, 16, 22, 10, 8, 10, 4, 103, 37, 144, 0, 16, 22, 10, 8, 10, 4, 103, 37, 148, 0, 16, 22, 10, 8, 10, 4, 103, 37, 152, 0, 16, 22, 10, 8, 10, 4, 103, 37, 156, 0, 16, 22, 10, 8, 10, 4, 103, 37, 160, 0, 16, 22, 10, 8, 10, 4, 103, 37, 164, 0, 16, 22, 10, 8, 10, 4, 103, 37, 172, 0, 16, 22, 10, 8, 10, 4, 103, 37, 176, 0, 16, 22, 10, 8, 10, 4, 103, 37, 188, 0, 16, 22, 10, 8, 10, 4, 103, 37, 208, 0, 16, 22, 10, 8, 10, 4, 103, 37, 212, 0, 16, 22, 10, 8, 10, 4, 103, 37, 216, 0, 16, 22, 10, 8, 10, 4, 103, 37, 220, 0, 16, 22, 10, 8, 10, 4, 103, 37, 248, 0, 16, 22, 10, 8, 10, 4, 103, 37, 252, 0, 16, 22, 10, 8, 10, 4, 103, 38, 0, 0, 16, 22, 10, 8, 10, 4, 103, 38, 32, 0, 16, 22, 10, 8, 10, 4, 103, 38, 40, 0, 16, 22, 10, 8, 10, 4, 103, 38, 44, 0, 16, 22, 10, 8, 10, 4, 103, 38, 56, 0, 16, 22, 10, 8, 10, 4, 103, 38, 76, 0, 16, 22, 10, 8, 10, 4, 103, 38, 84, 0, 16, 22, 10, 8, 10, 4, 103, 38, 92, 0, 16, 22, 10, 8, 10, 4, 103, 38, 96, 0, 16, 22, 10, 8, 10, 4, 103, 38, 116, 0, 16, 22, 10, 8, 10, 4, 103, 38, 132, 0, 16, 22, 10, 8, 10, 4, 103, 38, 140, 0, 16, 22, 10, 8, 10, 4, 103, 38, 220, 0, 16, 22, 10, 8, 10, 4, 103, 38, 224, 0, 16, 22, 10, 8, 10, 4, 103, 38, 228, 0, 16, 22, 10, 8, 10, 4, 103, 38, 232, 0, 16, 22, 10, 8, 10, 4, 103, 38, 252, 0, 16, 22, 10, 8, 10, 4, 103, 39, 16, 0, 16, 22, 10, 8, 10, 4, 103, 39, 64, 0, 16, 22, 10, 8, 10, 4, 103, 39, 88, 0, 16, 22, 10, 8, 10, 4, 103, 39, 100, 0, 16, 22, 10, 8, 10, 4, 103, 39, 104, 0, 16, 22, 10, 8, 10, 4, 103, 39, 108, 0, 16, 22, 10, 8, 10, 4, 103, 39, 160, 0, 16, 22, 10, 8, 10, 4, 103, 39, 164, 0, 16, 22, 10, 8, 10, 4, 103, 39, 168, 0, 16, 22, 10, 8, 10, 4, 103, 39, 172, 0, 16, 22, 10, 8, 10, 4, 103, 39, 176, 0, 16, 22, 10, 8, 10, 4, 103, 39, 180, 0, 16, 22, 10, 8, 10, 4, 103, 39, 184, 0, 16, 22, 10, 8, 10, 4, 103, 39, 188, 0, 16, 22, 10, 8, 10, 4, 103, 39, 200, 0, 16, 22, 10, 8, 10, 4, 103, 39, 204, 0, 16, 22, 10, 8, 10, 4, 103, 39, 208, 0, 16, 22, 10, 8, 10, 4, 103, 39, 212, 0, 16, 22, 10, 8, 10, 4, 103, 39, 216, 0, 16, 22, 10, 8, 10, 4, 103, 39, 220, 0, 16, 22, 10, 8, 10, 4, 103, 39, 224, 0, 16, 22, 10, 8, 10, 4, 103, 39, 228, 0, 16, 22, 10, 8, 10, 4, 103, 39, 232, 0, 16, 22, 10, 8, 10, 4, 103, 40, 12, 0, 16, 22, 10, 8, 10, 4, 103, 40, 16, 0, 16, 22, 10, 8, 10, 4, 103, 40, 20, 0, 16, 22, 10, 8, 10, 4, 103, 40, 24, 0, 16, 22, 10, 8, 10, 4, 103, 40, 28, 0, 16, 22, 10, 8, 10, 4, 103, 40, 32, 0, 16, 22, 10, 8, 10, 4, 103, 40, 36, 0, 16, 22, 10, 8, 10, 4, 103, 40, 40, 0, 16, 22, 10, 8, 10, 4, 103, 40, 44, 0, 16, 22, 10, 8, 10, 4, 103, 40, 88, 0, 16, 22, 10, 8, 10, 4, 103, 40, 100, 0, 16, 22, 10, 8, 10, 4, 103, 40, 112, 0, 16, 22, 10, 8, 10, 4, 103, 40, 192, 0, 16, 22, 10, 8, 10, 4, 103, 40, 212, 0, 16, 22, 10, 8, 10, 4, 103, 40, 220, 0, 16, 22, 10, 8, 10, 4, 103, 40, 228, 0, 16, 22, 10, 8, 10, 4, 103, 40, 232, 0, 16, 22, 10, 8, 10, 4, 103, 40, 236, 0, 16, 22, 10, 8, 10, 4, 103, 40, 240, 0, 16, 22, 10, 8, 10, 4, 103, 40, 244, 0, 16, 22, 10, 8, 10, 4, 103, 40, 248, 0, 16, 22, 10, 8, 10, 4, 103, 40, 252, 0, 16, 22, 10, 8, 10, 4, 103, 41, 0, 0, 16, 22, 10, 8, 10, 4, 103, 41, 16, 0, 16, 22, 10, 8, 10, 4, 103, 41, 52, 0, 16, 22, 10, 8, 10, 4, 103, 41, 140, 0, 16, 22, 10, 8, 10, 4, 103, 41, 148, 0, 16, 22, 10, 8, 10, 4, 103, 41, 152, 0, 16, 22, 10, 8, 10, 4, 103, 41, 160, 0, 16, 22, 10, 8, 10, 4, 103, 41, 164, 0, 16, 22, 10, 8, 10, 4, 103, 41, 220, 0, 16, 22, 10, 8, 10, 4, 103, 41, 224, 0, 16, 22, 10, 8, 10, 4, 103, 41, 228, 0, 16, 22, 10, 8, 10, 4, 103, 41, 232, 0, 16, 22, 10, 8, 10, 4, 103, 42, 8, 0, 16, 22, 10, 8, 10, 4, 103, 42, 24, 0, 16, 22, 10, 8, 10, 4, 103, 42, 28, 0, 16, 22, 10, 8, 10, 4, 103, 42, 32, 0, 16, 22, 10, 8, 10, 4, 103, 42, 64, 0, 16, 22, 10, 8, 10, 4, 103, 42, 68, 0, 16, 22, 10, 8, 10, 4, 103, 42, 76, 0, 16, 22, 10, 8, 10, 4, 103, 42, 104, 0, 16, 22, 10, 8, 10, 4, 103, 42, 180, 0, 16, 22, 10, 8, 10, 4, 103, 42, 232, 0, 16, 22, 10, 8, 10, 4, 103, 43, 16, 0, 16, 22, 10, 8, 10, 4, 103, 43, 84, 0, 16, 22, 10, 8, 10, 4, 103, 43, 96, 0, 16, 22, 10, 8, 10, 4, 103, 43, 100, 0, 16, 22, 10, 8, 10, 4, 103, 43, 104, 0, 16, 22, 10, 8, 10, 4, 103, 43, 124, 0, 16, 22, 10, 8, 10, 4, 103, 43, 184, 0, 16, 22, 10, 8, 10, 4, 103, 43, 192, 0, 16, 22, 10, 8, 10, 4, 103, 43, 196, 0, 16, 22, 10, 8, 10, 4, 103, 43, 208, 0, 16, 22, 10, 8, 10, 4, 103, 43, 220, 0, 16, 22, 10, 8, 10, 4, 103, 43, 224, 0, 16, 22, 10, 8, 10, 4, 103, 43, 232, 0, 16, 22, 10, 8, 10, 4, 103, 43, 240, 0, 16, 22, 10, 8, 10, 4, 103, 44, 56, 0, 16, 22, 10, 8, 10, 4, 103, 44, 80, 0, 16, 22, 10, 8, 10, 4, 103, 44, 88, 0, 16, 22, 10, 8, 10, 4, 103, 44, 120, 0, 16, 22, 10, 8, 10, 4, 103, 44, 124, 0, 16, 22, 10, 8, 10, 4, 103, 44, 132, 0, 16, 22, 10, 8, 10, 4, 103, 44, 144, 0, 16, 22, 10, 8, 10, 4, 103, 44, 168, 0, 16, 22, 10, 8, 10, 4, 103, 44, 176, 0, 16, 22, 10, 8, 10, 4, 103, 44, 180, 0, 16, 22, 10, 8, 10, 4, 103, 44, 184, 0, 16, 22, 10, 8, 10, 4, 103, 44, 188, 0, 16, 22, 10, 8, 10, 4, 103, 44, 192, 0, 16, 22, 10, 8, 10, 4, 103, 44, 196, 0, 16, 22, 10, 8, 10, 4, 103, 44, 200, 0, 16, 22, 10, 8, 10, 4, 103, 44, 204, 0, 16, 22, 10, 8, 10, 4, 103, 44, 224, 0, 16, 22, 10, 8, 10, 4, 103, 44, 236, 0, 16, 22, 10, 8, 10, 4, 103, 44, 240, 0, 16, 22, 10, 8, 10, 4, 103, 44, 244, 0, 16, 22, 10, 8, 10, 4, 103, 44, 248, 0, 16, 22, 10, 8, 10, 4, 103, 44, 252, 0, 16, 22, 10, 8, 10, 4, 103, 45, 0, 0, 16, 22, 10, 8, 10, 4, 103, 45, 4, 0, 16, 22, 10, 8, 10, 4, 103, 45, 8, 0, 16, 22, 10, 8, 10, 4, 103, 45, 12, 0, 16, 22, 10, 8, 10, 4, 103, 45, 16, 0, 16, 22, 10, 8, 10, 4, 103, 45, 20, 0, 16, 22, 10, 8, 10, 4, 103, 45, 24, 0, 16, 22, 10, 8, 10, 4, 103, 45, 28, 0, 16, 22, 10, 8, 10, 4, 103, 45, 32, 0, 16, 22, 10, 8, 10, 4, 103, 45, 36, 0, 16, 22, 10, 8, 10, 4, 103, 45, 40, 0, 16, 22, 10, 8, 10, 4, 103, 45, 44, 0, 16, 22, 10, 8, 10, 4, 103, 45, 48, 0, 16, 22, 10, 8, 10, 4, 103, 45, 52, 0, 16, 22, 10, 8, 10, 4, 103, 45, 56, 0, 16, 22, 10, 8, 10, 4, 103, 45, 60, 0, 16, 22, 10, 8, 10, 4, 103, 45, 72, 0, 16, 22, 10, 8, 10, 4, 103, 45, 76, 0, 16, 22, 10, 8, 10, 4, 103, 45, 80, 0, 16, 22, 10, 8, 10, 4, 103, 45, 84, 0, 16, 22, 10, 8, 10, 4, 103, 45, 88, 0, 16, 22, 10, 8, 10, 4, 103, 45, 92, 0, 16, 22, 10, 8, 10, 4, 103, 45, 96, 0, 16, 22, 10, 8, 10, 4, 103, 45, 100, 0, 16, 22, 10, 8, 10, 4, 103, 45, 104, 0, 16, 22, 10, 8, 10, 4, 103, 45, 108, 0, 16, 22, 10, 8, 10, 4, 103, 45, 112, 0, 16, 22, 10, 8, 10, 4, 103, 45, 116, 0, 16, 22, 10, 8, 10, 4, 103, 45, 120, 0, 16, 22, 10, 8, 10, 4, 103, 45, 124, 0, 16, 22, 10, 8, 10, 4, 103, 45, 128, 0, 16, 22, 10, 8, 10, 4, 103, 45, 132, 0, 16, 22, 10, 8, 10, 4, 103, 45, 136, 0, 16, 22, 10, 8, 10, 4, 103, 45, 140, 0, 16, 22, 10, 8, 10, 4, 103, 45, 144, 0, 16, 22, 10, 8, 10, 4, 103, 45, 148, 0, 16, 22, 10, 8, 10, 4, 103, 45, 152, 0, 16, 22, 10, 8, 10, 4, 103, 45, 156, 0, 16, 22, 10, 8, 10, 4, 103, 45, 160, 0, 16, 22, 10, 8, 10, 4, 103, 45, 164, 0, 16, 22, 10, 8, 10, 4, 103, 45, 168, 0, 16, 22, 10, 8, 10, 4, 103, 45, 172, 0, 16, 22, 10, 8, 10, 4, 103, 45, 176, 0, 16, 22, 10, 8, 10, 4, 103, 45, 180, 0, 16, 22, 10, 8, 10, 4, 103, 45, 184, 0, 16, 22, 10, 8, 10, 4, 103, 45, 188, 0, 16, 22, 10, 8, 10, 4, 103, 45, 192, 0, 16, 22, 10, 8, 10, 4, 103, 45, 196, 0, 16, 22, 10, 8, 10, 4, 103, 45, 200, 0, 16, 22, 10, 8, 10, 4, 103, 45, 204, 0, 16, 22, 10, 8, 10, 4, 103, 45, 208, 0, 16, 22, 10, 8, 10, 4, 103, 45, 212, 0, 16, 22, 10, 8, 10, 4, 103, 45, 216, 0, 16, 22, 10, 8, 10, 4, 103, 45, 220, 0, 16, 22, 10, 8, 10, 4, 103, 45, 224, 0, 16, 22, 10, 8, 10, 4, 103, 45, 248, 0, 16, 22, 10, 8, 10, 4, 103, 46, 0, 0, 16, 22, 10, 8, 10, 4, 103, 46, 12, 0, 16, 22, 10, 8, 10, 4, 103, 46, 16, 0, 16, 22, 10, 8, 10, 4, 103, 46, 20, 0, 16, 22, 10, 8, 10, 4, 103, 46, 24, 0, 16, 22, 10, 8, 10, 4, 103, 46, 28, 0, 16, 22, 10, 8, 10, 4, 103, 46, 32, 0, 16, 22, 10, 8, 10, 4, 103, 46, 36, 0, 16, 22, 10, 8, 10, 4, 103, 46, 40, 0, 16, 22, 10, 8, 10, 4, 103, 46, 44, 0, 16, 22, 10, 8, 10, 4, 103, 46, 48, 0, 16, 22, 10, 8, 10, 4, 103, 46, 52, 0, 16, 22, 10, 8, 10, 4, 103, 46, 56, 0, 16, 22, 10, 8, 10, 4, 103, 46, 60, 0, 16, 22, 10, 8, 10, 4, 103, 46, 64, 0, 16, 22, 10, 8, 10, 4, 103, 46, 68, 0, 16, 22, 10, 8, 10, 4, 103, 46, 72, 0, 16, 22, 10, 8, 10, 4, 103, 46, 76, 0, 16, 22, 10, 8, 10, 4, 103, 46, 80, 0, 16, 22, 10, 8, 10, 4, 103, 46, 84, 0, 16, 22, 10, 8, 10, 4, 103, 46, 88, 0, 16, 22, 10, 8, 10, 4, 103, 46, 92, 0, 16, 22, 10, 8, 10, 4, 103, 46, 96, 0, 16, 22, 10, 8, 10, 4, 103, 46, 100, 0, 16, 22, 10, 8, 10, 4, 103, 46, 104, 0, 16, 22, 10, 8, 10, 4, 103, 46, 108, 0, 16, 22, 10, 8, 10, 4, 103, 46, 112, 0, 16, 22, 10, 8, 10, 4, 103, 46, 116, 0, 16, 22, 10, 8, 10, 4, 103, 46, 120, 0, 16, 22, 10, 8, 10, 4, 103, 46, 124, 0, 16, 22, 10, 8, 10, 4, 103, 46, 128, 0, 16, 22, 10, 8, 10, 4, 103, 46, 132, 0, 16, 22, 10, 8, 10, 4, 103, 46, 136, 0, 16, 22, 10, 8, 10, 4, 103, 46, 152, 0, 16, 22, 10, 8, 10, 4, 103, 46, 156, 0, 16, 22, 10, 8, 10, 4, 103, 46, 160, 0, 16, 22, 10, 8, 10, 4, 103, 46, 164, 0, 16, 22, 10, 8, 10, 4, 103, 46, 168, 0, 16, 22, 10, 8, 10, 4, 103, 46, 172, 0, 16, 22, 10, 8, 10, 4, 103, 46, 176, 0, 16, 22, 10, 8, 10, 4, 103, 46, 180, 0, 16, 22, 10, 8, 10, 4, 103, 46, 244, 0, 16, 22, 10, 8, 10, 4, 103, 46, 248, 0, 16, 22, 10, 8, 10, 4, 103, 47, 4, 0, 16, 22, 10, 8, 10, 4, 103, 47, 20, 0, 16, 22, 10, 8, 10, 4, 103, 47, 36, 0, 16, 22, 10, 8, 10, 4, 103, 47, 40, 0, 16, 22, 10, 8, 10, 4, 103, 47, 48, 0, 16, 22, 10, 8, 10, 4, 103, 47, 80, 0, 16, 22, 10, 8, 10, 4, 103, 47, 96, 0, 16, 22, 10, 8, 10, 4, 103, 47, 108, 0, 16, 22, 10, 8, 10, 4, 103, 47, 116, 0, 16, 22, 10, 8, 10, 4, 103, 47, 120, 0, 16, 22, 10, 8, 10, 4, 103, 47, 136, 0, 16, 22, 10, 8, 10, 4, 103, 47, 140, 0, 16, 22, 10, 8, 10, 4, 103, 47, 212, 0, 16, 22, 10, 8, 10, 4, 103, 48, 20, 0, 16, 22, 10, 8, 10, 4, 103, 48, 52, 0, 16, 22, 10, 8, 10, 4, 103, 48, 92, 0, 16, 22, 10, 8, 10, 4, 103, 48, 144, 0, 16, 22, 10, 8, 10, 4, 103, 48, 148, 0, 16, 22, 10, 8, 10, 4, 103, 48, 152, 0, 16, 22, 10, 8, 10, 4, 103, 48, 156, 0, 16, 22, 10, 8, 10, 4, 103, 48, 202, 0, 16, 23, 10, 8, 10, 4, 103, 48, 216, 0, 16, 22, 10, 8, 10, 4, 103, 48, 220, 0, 16, 22, 10, 8, 10, 4, 103, 48, 224, 0, 16, 22, 10, 8, 10, 4, 103, 48, 228, 0, 16, 22, 10, 8, 10, 4, 103, 48, 232, 0, 16, 22, 10, 8, 10, 4, 103, 48, 236, 0, 16, 22, 10, 8, 10, 4, 103, 48, 240, 0, 16, 22, 10, 8, 10, 4, 103, 48, 244, 0, 16, 22, 10, 8, 10, 4, 103, 49, 12, 0, 16, 22, 10, 8, 10, 4, 103, 49, 20, 0, 16, 22, 10, 8, 10, 4, 103, 49, 72, 0, 16, 22, 10, 8, 10, 4, 103, 49, 76, 0, 16, 22, 10, 8, 10, 4, 103, 49, 92, 0, 16, 22, 10, 8, 10, 4, 103, 49, 96, 0, 16, 22, 10, 8, 10, 4, 103, 49, 108, 0, 16, 22, 10, 8, 10, 4, 103, 49, 128, 0, 16, 22, 10, 8, 10, 4, 103, 49, 176, 0, 16, 22, 10, 8, 10, 4, 103, 49, 180, 0, 16, 22, 10, 8, 10, 4, 103, 49, 196, 0, 16, 22, 10, 8, 10, 4, 103, 49, 248, 0, 16, 22, 10, 8, 10, 4, 103, 50, 36, 0, 16, 22, 10, 8, 10, 4, 103, 50, 44, 0, 16, 22, 10, 8, 10, 4, 103, 50, 48, 0, 16, 22, 10, 8, 10, 4, 103, 50, 52, 0, 16, 22, 10, 8, 10, 4, 103, 50, 56, 0, 16, 22, 10, 8, 10, 4, 103, 50, 60, 0, 16, 22, 10, 8, 10, 4, 103, 50, 64, 0, 16, 22, 10, 8, 10, 4, 103, 50, 68, 0, 16, 22, 10, 8, 10, 4, 103, 50, 72, 0, 16, 22, 10, 8, 10, 4, 103, 50, 108, 0, 16, 22, 10, 8, 10, 4, 103, 50, 112, 0, 16, 22, 10, 8, 10, 4, 103, 50, 116, 0, 16, 22, 10, 8, 10, 4, 103, 50, 120, 0, 16, 22, 10, 8, 10, 4, 103, 50, 124, 0, 16, 22, 10, 8, 10, 4, 103, 50, 132, 0, 16, 22, 10, 8, 10, 4, 103, 50, 136, 0, 16, 22, 10, 8, 10, 4, 103, 50, 140, 0, 16, 22, 10, 8, 10, 4, 103, 50, 172, 0, 16, 22, 10, 8, 10, 4, 103, 50, 176, 0, 16, 22, 10, 8, 10, 4, 103, 50, 180, 0, 16, 22, 10, 8, 10, 4, 103, 50, 184, 0, 16, 22, 10, 8, 10, 4, 103, 50, 188, 0, 16, 22, 10, 8, 10, 4, 103, 50, 192, 0, 16, 22, 10, 8, 10, 4, 103, 50, 196, 0, 16, 22, 10, 8, 10, 4, 103, 50, 200, 0, 16, 22, 10, 8, 10, 4, 103, 50, 220, 0, 16, 22, 10, 8, 10, 4, 103, 50, 224, 0, 16, 22, 10, 8, 10, 4, 103, 50, 228, 0, 16, 22, 10, 8, 10, 4, 103, 50, 232, 0, 16, 22, 10, 8, 10, 4, 103, 50, 236, 0, 16, 22, 10, 8, 10, 4, 103, 50, 240, 0, 16, 22, 10, 8, 10, 4, 103, 50, 244, 0, 16, 22, 10, 8, 10, 4, 103, 50, 248, 0, 16, 22, 10, 8, 10, 4, 103, 52, 40, 0, 16, 22, 10, 8, 10, 4, 103, 52, 72, 0, 16, 22, 10, 8, 10, 4, 103, 52, 76, 0, 16, 22, 10, 8, 10, 4, 103, 52, 80, 0, 16, 22, 10, 8, 10, 4, 103, 52, 84, 0, 16, 22, 10, 8, 10, 4, 103, 52, 96, 0, 16, 22, 10, 8, 10, 4, 103, 52, 100, 0, 16, 22, 10, 8, 10, 4, 103, 52, 104, 0, 16, 22, 10, 8, 10, 4, 103, 52, 160, 0, 16, 22, 10, 8, 10, 4, 103, 52, 164, 0, 16, 22, 10, 8, 10, 4, 103, 52, 172, 0, 16, 22, 10, 8, 10, 4, 103, 52, 176, 0, 16, 22, 10, 8, 10, 4, 103, 52, 184, 0, 16, 22, 10, 8, 10, 4, 103, 52, 196, 0, 16, 22, 10, 8, 10, 4, 103, 53, 4, 0, 16, 22, 10, 8, 10, 4, 103, 53, 64, 0, 16, 22, 10, 8, 10, 4, 103, 53, 68, 0, 16, 22, 10, 8, 10, 4, 103, 53, 92, 0, 16, 22, 10, 8, 10, 4, 103, 53, 100, 0, 16, 22, 10, 8, 10, 4, 103, 53, 124, 0, 16, 22, 10, 8, 10, 4, 103, 53, 128, 0, 16, 22, 10, 8, 10, 4, 103, 53, 132, 0, 16, 22, 10, 8, 10, 4, 103, 53, 136, 0, 16, 22, 10, 8, 10, 4, 103, 53, 140, 0, 16, 22, 10, 8, 10, 4, 103, 53, 144, 0, 16, 22, 10, 8, 10, 4, 103, 53, 160, 0, 16, 22, 10, 8, 10, 4, 103, 53, 180, 0, 16, 22, 10, 8, 10, 4, 103, 53, 204, 0, 16, 22, 10, 8, 10, 4, 103, 53, 208, 0, 16, 22, 10, 8, 10, 4, 103, 53, 212, 0, 16, 22, 10, 8, 10, 4, 103, 53, 216, 0, 16, 22, 10, 8, 10, 4, 103, 53, 236, 0, 16, 22, 10, 8, 10, 4, 103, 53, 248, 0, 16, 22, 10, 8, 10, 4, 103, 54, 8, 0, 16, 22, 10, 8, 10, 4, 103, 54, 48, 0, 16, 22, 10, 8, 10, 4, 103, 54, 60, 0, 16, 22, 10, 8, 10, 4, 103, 54, 160, 0, 16, 22, 10, 8, 10, 4, 103, 54, 164, 0, 16, 22, 10, 8, 10, 4, 103, 54, 212, 0, 16, 22, 10, 8, 10, 4, 103, 54, 228, 0, 16, 22, 10, 8, 10, 4, 103, 54, 240, 0, 16, 22, 10, 8, 10, 4, 103, 55, 24, 0, 16, 22, 10, 8, 10, 4, 103, 55, 80, 0, 16, 22, 10, 8, 10, 4, 103, 55, 120, 0, 16, 22, 10, 8, 10, 4, 103, 55, 152, 0, 16, 22, 10, 8, 10, 4, 103, 55, 172, 0, 16, 22, 10, 8, 10, 4, 103, 55, 204, 0, 16, 22, 10, 8, 10, 4, 103, 55, 208, 0, 16, 22, 10, 8, 10, 4, 103, 55, 228, 0, 16, 22, 10, 8, 10, 4, 103, 55, 236, 0, 16, 22, 10, 8, 10, 4, 103, 55, 240, 0, 16, 22, 10, 8, 10, 4, 103, 56, 8, 0, 16, 22, 10, 8, 10, 4, 103, 56, 16, 0, 16, 22, 10, 8, 10, 4, 103, 56, 20, 0, 16, 22, 10, 8, 10, 4, 103, 56, 32, 0, 16, 22, 10, 8, 10, 4, 103, 56, 52, 0, 16, 22, 10, 8, 10, 4, 103, 56, 56, 0, 16, 22, 10, 8, 10, 4, 103, 56, 60, 0, 16, 22, 10, 8, 10, 4, 103, 56, 72, 0, 16, 22, 10, 8, 10, 4, 103, 56, 76, 0, 16, 22, 10, 8, 10, 4, 103, 56, 140, 0, 16, 22, 10, 8, 10, 4, 103, 56, 152, 0, 16, 22, 10, 8, 10, 4, 103, 56, 184, 0, 16, 22, 10, 8, 10, 4, 103, 56, 200, 0, 16, 22, 10, 8, 10, 4, 103, 57, 12, 0, 16, 22, 10, 8, 10, 4, 103, 57, 52, 0, 16, 22, 10, 8, 10, 4, 103, 57, 56, 0, 16, 22, 10, 8, 10, 4, 103, 57, 76, 0, 16, 22, 10, 8, 10, 4, 103, 57, 136, 0, 16, 22, 10, 8, 10, 4, 103, 57, 196, 0, 16, 22, 10, 8, 10, 4, 103, 58, 24, 0, 16, 22, 10, 8, 10, 4, 103, 58, 182, 0, 16, 23, 10, 8, 10, 4, 103, 59, 76, 0, 16, 22, 10, 8, 10, 4, 103, 59, 100, 0, 16, 22, 10, 8, 10, 4, 103, 59, 112, 0, 16, 22, 10, 8, 10, 4, 103, 59, 116, 0, 16, 22, 10, 8, 10, 4, 103, 59, 120, 0, 16, 22, 10, 8, 10, 4, 103, 59, 124, 0, 16, 22, 10, 8, 10, 4, 103, 59, 128, 0, 16, 22, 10, 8, 10, 4, 103, 59, 148, 0, 16, 22, 10, 8, 10, 4, 103, 59, 164, 0, 16, 22, 10, 8, 10, 4, 103, 60, 32, 0, 16, 22, 10, 8, 10, 4, 103, 60, 44, 0, 16, 22, 10, 8, 10, 4, 103, 60, 164, 0, 16, 22, 10, 8, 10, 4, 103, 60, 228, 0, 16, 22, 10, 8, 10, 4, 103, 60, 236, 0, 16, 22, 10, 8, 10, 4, 103, 61, 60, 0, 16, 22, 10, 8, 10, 4, 103, 61, 104, 0, 16, 22, 10, 8, 10, 4, 103, 61, 140, 0, 16, 22, 10, 8, 10, 4, 103, 61, 152, 0, 16, 22, 10, 8, 10, 4, 103, 61, 156, 0, 16, 22, 10, 8, 10, 4, 103, 61, 160, 0, 16, 22, 10, 8, 10, 4, 103, 61, 172, 0, 16, 22, 10, 8, 10, 4, 103, 61, 176, 0, 16, 22, 10, 8, 10, 4, 103, 61, 184, 0, 16, 22, 10, 8, 10, 4, 103, 61, 188, 0, 16, 22, 10, 8, 10, 4, 103, 62, 24, 0, 16, 22, 10, 8, 10, 4, 103, 62, 52, 0, 16, 22, 10, 8, 10, 4, 103, 62, 72, 0, 16, 22, 10, 8, 10, 4, 103, 62, 76, 0, 16, 22, 10, 8, 10, 4, 103, 62, 80, 0, 16, 22, 10, 8, 10, 4, 103, 62, 84, 0, 16, 22, 10, 8, 10, 4, 103, 62, 88, 0, 16, 22, 10, 8, 10, 4, 103, 62, 96, 0, 16, 22, 10, 8, 10, 4, 103, 62, 100, 0, 16, 22, 10, 8, 10, 4, 103, 62, 104, 0, 16, 22, 10, 8, 10, 4, 103, 62, 108, 0, 16, 22, 10, 8, 10, 4, 103, 62, 112, 0, 16, 22, 10, 8, 10, 4, 103, 62, 116, 0, 16, 22, 10, 8, 10, 4, 103, 62, 120, 0, 16, 22, 10, 8, 10, 4, 103, 62, 124, 0, 16, 22, 10, 8, 10, 4, 103, 62, 128, 0, 16, 22, 10, 8, 10, 4, 103, 62, 132, 0, 16, 22, 10, 8, 10, 4, 103, 62, 156, 0, 16, 22, 10, 8, 10, 4, 103, 62, 160, 0, 16, 22, 10, 8, 10, 4, 103, 62, 164, 0, 16, 22, 10, 8, 10, 4, 103, 62, 168, 0, 16, 22, 10, 8, 10, 4, 103, 62, 172, 0, 16, 22, 10, 8, 10, 4, 103, 62, 176, 0, 16, 22, 10, 8, 10, 4, 103, 62, 180, 0, 16, 22, 10, 8, 10, 4, 103, 62, 184, 0, 16, 22, 10, 8, 10, 4, 103, 62, 188, 0, 16, 22, 10, 8, 10, 4, 103, 62, 192, 0, 16, 22, 10, 8, 10, 4, 103, 62, 204, 0, 16, 22, 10, 8, 10, 4, 103, 62, 208, 0, 16, 22, 10, 8, 10, 4, 103, 62, 212, 0, 16, 22, 10, 8, 10, 4, 103, 62, 216, 0, 16, 22, 10, 8, 10, 4, 103, 62, 220, 0, 16, 22, 10, 8, 10, 4, 103, 62, 224, 0, 16, 22, 10, 8, 10, 4, 103, 63, 32, 0, 16, 22, 10, 8, 10, 4, 103, 63, 36, 0, 16, 22, 10, 8, 10, 4, 103, 63, 40, 0, 16, 22, 10, 8, 10, 4, 103, 63, 44, 0, 16, 22, 10, 8, 10, 4, 103, 63, 48, 0, 16, 22, 10, 8, 10, 4, 103, 63, 52, 0, 16, 22, 10, 8, 10, 4, 103, 63, 56, 0, 16, 22, 10, 8, 10, 4, 103, 63, 60, 0, 16, 22, 10, 8, 10, 4, 103, 63, 64, 0, 16, 22, 10, 8, 10, 4, 103, 63, 68, 0, 16, 22, 10, 8, 10, 4, 103, 63, 72, 0, 16, 22, 10, 8, 10, 4, 103, 63, 76, 0, 16, 22, 10, 8, 10, 4, 103, 63, 80, 0, 16, 22, 10, 8, 10, 4, 103, 63, 84, 0, 16, 22, 10, 8, 10, 4, 103, 63, 88, 0, 16, 22, 10, 8, 10, 4, 103, 63, 140, 0, 16, 22, 10, 8, 10, 4, 103, 63, 144, 0, 16, 22, 10, 8, 10, 4, 103, 63, 152, 0, 16, 22, 10, 8, 10, 4, 103, 63, 160, 0, 16, 22, 10, 8, 10, 4, 103, 63, 164, 0, 16, 22, 10, 8, 10, 4, 103, 63, 168, 0, 16, 22, 10, 8, 10, 4, 103, 63, 172, 0, 16, 22, 10, 8, 10, 4, 103, 63, 176, 0, 16, 22, 10, 8, 10, 4, 103, 63, 180, 0, 16, 22, 10, 8, 10, 4, 103, 63, 184, 0, 16, 22, 10, 8, 10, 4, 103, 63, 192, 0, 16, 22, 10, 8, 10, 4, 103, 63, 196, 0, 16, 22, 10, 8, 10, 4, 103, 63, 200, 0, 16, 22, 10, 8, 10, 4, 103, 63, 204, 0, 16, 22, 10, 8, 10, 4, 103, 63, 208, 0, 16, 22, 10, 8, 10, 4, 103, 63, 240, 0, 16, 22, 10, 8, 10, 4, 103, 63, 244, 0, 16, 22, 10, 8, 10, 4, 103, 63, 248, 0, 16, 22, 10, 8, 10, 4, 103, 63, 252, 0, 16, 22, 10, 8, 10, 4, 103, 64, 0, 0, 16, 22, 10, 8, 10, 4, 103, 64, 4, 0, 16, 22, 10, 8, 10, 4, 103, 64, 24, 0, 16, 22, 10, 8, 10, 4, 103, 64, 28, 0, 16, 22, 10, 8, 10, 4, 103, 64, 32, 0, 16, 22, 10, 8, 10, 4, 103, 64, 36, 0, 16, 22, 10, 8, 10, 4, 103, 64, 40, 0, 16, 22, 10, 8, 10, 4, 103, 64, 44, 0, 16, 22, 10, 8, 10, 4, 103, 64, 48, 0, 16, 22, 10, 8, 10, 4, 103, 64, 52, 0, 16, 22, 10, 8, 10, 4, 103, 64, 56, 0, 16, 22, 10, 8, 10, 4, 103, 64, 60, 0, 16, 22, 10, 8, 10, 4, 103, 64, 64, 0, 16, 22, 10, 8, 10, 4, 103, 64, 68, 0, 16, 22, 10, 8, 10, 4, 103, 64, 72, 0, 16, 22, 10, 8, 10, 4, 103, 64, 76, 0, 16, 22, 10, 8, 10, 4, 103, 64, 80, 0, 16, 22, 10, 8, 10, 4, 103, 64, 84, 0, 16, 22, 10, 8, 10, 4, 103, 64, 88, 0, 16, 22, 10, 8, 10, 4, 103, 64, 92, 0, 16, 22, 10, 8, 10, 4, 103, 64, 96, 0, 16, 22, 10, 8, 10, 4, 103, 64, 100, 0, 16, 22, 10, 8, 10, 4, 103, 64, 104, 0, 16, 22, 10, 8, 10, 4, 103, 64, 108, 0, 16, 22, 10, 8, 10, 4, 103, 64, 112, 0, 16, 22, 10, 8, 10, 4, 103, 64, 116, 0, 16, 22, 10, 8, 10, 4, 103, 64, 120, 0, 16, 22, 10, 8, 10, 4, 103, 64, 124, 0, 16, 22, 10, 8, 10, 4, 103, 64, 140, 0, 16, 22, 10, 8, 10, 4, 103, 64, 144, 0, 16, 22, 10, 8, 10, 4, 103, 64, 152, 0, 16, 22, 10, 8, 10, 4, 103, 64, 156, 0, 16, 22, 10, 8, 10, 4, 103, 64, 160, 0, 16, 22, 10, 8, 10, 4, 103, 64, 164, 0, 16, 22, 10, 8, 10, 4, 103, 64, 168, 0, 16, 22, 10, 8, 10, 4, 103, 64, 172, 0, 16, 22, 10, 8, 10, 4, 103, 64, 176, 0, 16, 22, 10, 8, 10, 4, 103, 64, 180, 0, 16, 22, 10, 8, 10, 4, 103, 64, 184, 0, 16, 22, 10, 8, 10, 4, 103, 64, 188, 0, 16, 22, 10, 8, 10, 4, 103, 64, 192, 0, 16, 22, 10, 8, 10, 4, 103, 64, 196, 0, 16, 22, 10, 8, 10, 4, 103, 64, 200, 0, 16, 22, 10, 8, 10, 4, 103, 64, 204, 0, 16, 22, 10, 8, 10, 4, 103, 64, 208, 0, 16, 22, 10, 8, 10, 4, 103, 64, 212, 0, 16, 22, 10, 8, 10, 4, 103, 64, 216, 0, 16, 22, 10, 8, 10, 4, 103, 64, 220, 0, 16, 22, 10, 8, 10, 4, 103, 64, 224, 0, 16, 22, 10, 8, 10, 4, 103, 64, 228, 0, 16, 22, 10, 8, 10, 4, 103, 64, 232, 0, 16, 22, 10, 8, 10, 4, 103, 64, 236, 0, 16, 22, 10, 8, 10, 4, 103, 64, 240, 0, 16, 22, 10, 8, 10, 4, 103, 64, 244, 0, 16, 22, 10, 8, 10, 4, 103, 64, 248, 0, 16, 22, 10, 8, 10, 4, 103, 64, 252, 0, 16, 22, 10, 8, 10, 4, 103, 65, 0, 0, 16, 22, 10, 8, 10, 4, 103, 65, 4, 0, 16, 22, 10, 8, 10, 4, 103, 65, 8, 0, 16, 22, 10, 8, 10, 4, 103, 65, 12, 0, 16, 22, 10, 8, 10, 4, 103, 65, 16, 0, 16, 22, 10, 8, 10, 4, 103, 65, 36, 0, 16, 22, 10, 8, 10, 4, 103, 65, 40, 0, 16, 22, 10, 8, 10, 4, 103, 65, 48, 0, 16, 22, 10, 8, 10, 4, 103, 65, 52, 0, 16, 22, 10, 8, 10, 4, 103, 65, 56, 0, 16, 22, 10, 8, 10, 4, 103, 65, 60, 0, 16, 22, 10, 8, 10, 4, 103, 65, 64, 0, 16, 22, 10, 8, 10, 4, 103, 65, 68, 0, 16, 22, 10, 8, 10, 4, 103, 65, 72, 0, 16, 22, 10, 8, 10, 4, 103, 65, 76, 0, 16, 22, 10, 8, 10, 4, 103, 65, 80, 0, 16, 22, 10, 8, 10, 4, 103, 65, 84, 0, 16, 22, 10, 8, 10, 4, 103, 65, 88, 0, 16, 22, 10, 8, 10, 4, 103, 65, 92, 0, 16, 22, 10, 8, 10, 4, 103, 65, 100, 0, 16, 22, 10, 8, 10, 4, 103, 65, 104, 0, 16, 22, 10, 8, 10, 4, 103, 65, 108, 0, 16, 22, 10, 8, 10, 4, 103, 65, 112, 0, 16, 22, 10, 8, 10, 4, 103, 65, 144, 0, 16, 22, 10, 8, 10, 4, 103, 65, 148, 0, 16, 22, 10, 8, 10, 4, 103, 65, 152, 0, 16, 22, 10, 8, 10, 4, 103, 65, 156, 0, 16, 22, 10, 8, 10, 4, 103, 65, 160, 0, 16, 22, 10, 8, 10, 4, 103, 65, 164, 0, 16, 22, 10, 8, 10, 4, 103, 65, 168, 0, 16, 22, 10, 8, 10, 4, 103, 65, 172, 0, 16, 22, 10, 8, 10, 4, 103, 66, 32, 0, 16, 22, 10, 8, 10, 4, 103, 66, 40, 0, 16, 22, 10, 8, 10, 4, 103, 66, 92, 0, 16, 22, 10, 8, 10, 4, 103, 66, 108, 0, 16, 22, 10, 8, 10, 4, 103, 66, 200, 0, 16, 22, 10, 8, 10, 4, 103, 66, 216, 0, 16, 22, 10, 8, 10, 4, 103, 66, 240, 0, 16, 22, 10, 8, 10, 4, 103, 66, 244, 0, 16, 22, 10, 8, 10, 4, 103, 66, 248, 0, 16, 22, 10, 8, 10, 4, 103, 66, 252, 0, 16, 22, 10, 8, 10, 4, 103, 67, 0, 0, 16, 22, 10, 8, 10, 4, 103, 67, 4, 0, 16, 22, 10, 8, 10, 4, 103, 67, 8, 0, 16, 22, 10, 8, 10, 4, 103, 67, 100, 0, 16, 22, 10, 8, 10, 4, 103, 67, 104, 0, 16, 22, 10, 8, 10, 4, 103, 67, 108, 0, 16, 22, 10, 8, 10, 4, 103, 67, 112, 0, 16, 22, 10, 8, 10, 4, 103, 67, 116, 0, 16, 22, 10, 8, 10, 4, 103, 67, 120, 0, 16, 22, 10, 8, 10, 4, 103, 67, 124, 0, 16, 22, 10, 8, 10, 4, 103, 67, 128, 0, 16, 22, 10, 8, 10, 4, 103, 67, 132, 0, 16, 22, 10, 8, 10, 4, 103, 67, 136, 0, 16, 22, 10, 8, 10, 4, 103, 67, 140, 0, 16, 22, 10, 8, 10, 4, 103, 67, 144, 0, 16, 22, 10, 8, 10, 4, 103, 67, 148, 0, 16, 22, 10, 8, 10, 4, 103, 67, 172, 0, 16, 22, 10, 8, 10, 4, 103, 67, 192, 0, 16, 22, 10, 8, 10, 4, 103, 67, 212, 0, 16, 22, 10, 8, 10, 4, 103, 67, 252, 0, 16, 22, 10, 8, 10, 4, 103, 68, 64, 0, 16, 22, 10, 8, 10, 4, 103, 68, 88, 0, 16, 22, 10, 8, 10, 4, 103, 68, 100, 0, 16, 22, 10, 8, 10, 4, 103, 68, 128, 0, 16, 22, 10, 8, 10, 4, 103, 68, 192, 0, 16, 22, 10, 8, 10, 4, 103, 69, 16, 0, 16, 22, 10, 8, 10, 4, 103, 69, 116, 0, 16, 22, 10, 8, 10, 4, 103, 69, 132, 0, 16, 22, 10, 8, 10, 4, 103, 69, 152, 0, 16, 22, 10, 8, 10, 4, 103, 69, 212, 0, 16, 22, 10, 8, 10, 4, 103, 70, 8, 0, 16, 22, 10, 8, 10, 4, 103, 70, 148, 0, 16, 22, 10, 8, 10, 4, 103, 70, 184, 0, 16, 22, 10, 8, 10, 4, 103, 70, 220, 0, 16, 22, 10, 8, 10, 4, 103, 70, 224, 0, 16, 22, 10, 8, 10, 4, 103, 70, 236, 0, 16, 22, 10, 8, 10, 4, 103, 70, 252, 0, 16, 22, 10, 8, 10, 4, 103, 71, 0, 0, 16, 22, 10, 8, 10, 4, 103, 71, 32, 0, 16, 22, 10, 8, 10, 4, 103, 71, 48, 0, 16, 22, 10, 8, 10, 4, 103, 71, 68, 0, 16, 22, 10, 8, 10, 4, 103, 71, 72, 0, 16, 22, 10, 8, 10, 4, 103, 71, 80, 0, 16, 22, 10, 8, 10, 4, 103, 71, 84, 0, 16, 22, 10, 8, 10, 4, 103, 71, 88, 0, 16, 22, 10, 8, 10, 4, 103, 71, 120, 0, 16, 22, 10, 8, 10, 4, 103, 71, 124, 0, 16, 22, 10, 8, 10, 4, 103, 71, 128, 0, 16, 22, 10, 8, 10, 4, 103, 71, 144, 0, 16, 22, 10, 8, 10, 4, 103, 71, 196, 0, 16, 22, 10, 8, 10, 4, 103, 71, 200, 0, 16, 22, 10, 8, 10, 4, 103, 71, 232, 0, 16, 22, 10, 8, 10, 4, 103, 72, 12, 0, 16, 22, 10, 8, 10, 4, 103, 72, 16, 0, 16, 22, 10, 8, 10, 4, 103, 72, 20, 0, 16, 22, 10, 8, 10, 4, 103, 72, 24, 0, 16, 22, 10, 8, 10, 4, 103, 72, 28, 0, 16, 22, 10, 8, 10, 4, 103, 72, 32, 0, 16, 22, 10, 8, 10, 4, 103, 72, 36, 0, 16, 22, 10, 8, 10, 4, 103, 72, 40, 0, 16, 22, 10, 8, 10, 4, 103, 72, 44, 0, 16, 22, 10, 8, 10, 4, 103, 72, 48, 0, 16, 22, 10, 8, 10, 4, 103, 72, 52, 0, 16, 22, 10, 8, 10, 4, 103, 72, 112, 0, 16, 22, 10, 8, 10, 4, 103, 72, 116, 0, 16, 22, 10, 8, 10, 4, 103, 72, 120, 0, 16, 22, 10, 8, 10, 4, 103, 72, 124, 0, 16, 22, 10, 8, 10, 4, 103, 72, 128, 0, 16, 22, 10, 8, 10, 4, 103, 72, 132, 0, 16, 22, 10, 8, 10, 4, 103, 72, 144, 0, 16, 22, 10, 8, 10, 4, 103, 72, 148, 0, 16, 22, 10, 8, 10, 4, 103, 72, 164, 0, 16, 22, 10, 8, 10, 4, 103, 72, 172, 0, 16, 22, 10, 8, 10, 4, 103, 72, 180, 0, 16, 22, 10, 8, 10, 4, 103, 72, 224, 0, 16, 22, 10, 8, 10, 4, 103, 72, 228, 0, 16, 22, 10, 8, 10, 4, 103, 72, 232, 0, 16, 22, 10, 8, 10, 4, 103, 72, 236, 0, 16, 22, 10, 8, 10, 4, 103, 72, 240, 0, 16, 22, 10, 8, 10, 4, 103, 72, 244, 0, 16, 22, 10, 8, 10, 4, 103, 72, 248, 0, 16, 22, 10, 8, 10, 4, 103, 72, 252, 0, 16, 22, 10, 8, 10, 4, 103, 73, 0, 0, 16, 22, 10, 8, 10, 4, 103, 73, 4, 0, 16, 22, 10, 8, 10, 4, 103, 73, 8, 0, 16, 22, 10, 8, 10, 4, 103, 73, 12, 0, 16, 22, 10, 8, 10, 4, 103, 73, 16, 0, 16, 22, 10, 8, 10, 4, 103, 73, 20, 0, 16, 22, 10, 8, 10, 4, 103, 73, 24, 0, 16, 22, 10, 8, 10, 4, 103, 73, 28, 0, 16, 22, 10, 8, 10, 4, 103, 73, 48, 0, 16, 22, 10, 8, 10, 4, 103, 73, 88, 0, 16, 22, 10, 8, 10, 4, 103, 73, 96, 0, 16, 22, 10, 8, 10, 4, 103, 73, 116, 0, 16, 22, 10, 8, 10, 4, 103, 73, 120, 0, 16, 22, 10, 8, 10, 4, 103, 73, 128, 0, 16, 22, 10, 8, 10, 4, 103, 73, 132, 0, 16, 22, 10, 8, 10, 4, 103, 73, 136, 0, 16, 22, 10, 8, 10, 4, 103, 73, 140, 0, 16, 22, 10, 8, 10, 4, 103, 73, 144, 0, 16, 22, 10, 8, 10, 4, 103, 73, 168, 0, 16, 22, 10, 8, 10, 4, 103, 73, 176, 0, 16, 22, 10, 8, 10, 4, 103, 73, 204, 0, 16, 22, 10, 8, 10, 4, 103, 73, 208, 0, 16, 22, 10, 8, 10, 4, 103, 73, 240, 0, 16, 22, 10, 8, 10, 4, 103, 73, 244, 0, 16, 22, 10, 8, 10, 4, 103, 73, 248, 0, 16, 22, 10, 8, 10, 4, 103, 74, 24, 0, 16, 22, 10, 8, 10, 4, 103, 74, 28, 0, 16, 22, 10, 8, 10, 4, 103, 74, 32, 0, 16, 22, 10, 8, 10, 4, 103, 74, 36, 0, 16, 22, 10, 8, 10, 4, 103, 74, 40, 0, 16, 22, 10, 8, 10, 4, 103, 74, 44, 0, 16, 22, 10, 8, 10, 4, 103, 74, 48, 0, 16, 22, 10, 8, 10, 4, 103, 74, 56, 0, 16, 22, 10, 8, 10, 4, 103, 74, 60, 0, 16, 22, 10, 8, 10, 4, 103, 74, 80, 0, 16, 22, 10, 8, 10, 4, 103, 74, 124, 0, 16, 22, 10, 8, 10, 4, 103, 74, 148, 0, 16, 22, 10, 8, 10, 4, 103, 74, 152, 0, 16, 22, 10, 8, 10, 4, 103, 74, 156, 0, 16, 22, 10, 8, 10, 4, 103, 74, 204, 0, 16, 22, 10, 8, 10, 4, 103, 74, 232, 0, 16, 22, 10, 8, 10, 4, 103, 75, 16, 0, 16, 22, 10, 8, 10, 4, 103, 75, 84, 0, 16, 22, 10, 8, 10, 4, 103, 75, 88, 0, 16, 22, 10, 8, 10, 4, 103, 75, 92, 0, 16, 22, 10, 8, 10, 4, 103, 75, 104, 0, 16, 22, 10, 8, 10, 4, 103, 75, 108, 0, 16, 22, 10, 8, 10, 4, 103, 75, 112, 0, 16, 22, 10, 8, 10, 4, 103, 75, 120, 0, 16, 22, 10, 8, 10, 4, 103, 75, 128, 0, 16, 22, 10, 8, 10, 4, 103, 75, 144, 0, 16, 22, 10, 8, 10, 4, 103, 75, 152, 0, 16, 22, 10, 8, 10, 4, 103, 75, 236, 0, 16, 24, 10, 8, 10, 4, 103, 76, 60, 0, 16, 22, 10, 8, 10, 4, 103, 76, 64, 0, 16, 22, 10, 8, 10, 4, 103, 76, 68, 0, 16, 22, 10, 8, 10, 4, 103, 76, 72, 0, 16, 22, 10, 8, 10, 4, 103, 76, 84, 0, 16, 22, 10, 8, 10, 4, 103, 76, 92, 0, 16, 22, 10, 8, 10, 4, 103, 76, 104, 0, 16, 22, 10, 8, 10, 4, 103, 76, 216, 0, 16, 22, 10, 8, 10, 4, 103, 76, 220, 0, 16, 22, 10, 8, 10, 4, 103, 76, 224, 0, 16, 22, 10, 8, 10, 4, 103, 77, 28, 0, 16, 22, 10, 8, 10, 4, 103, 77, 52, 0, 16, 22, 10, 8, 10, 4, 103, 77, 56, 0, 16, 22, 10, 8, 10, 4, 103, 77, 72, 0, 16, 22, 10, 8, 10, 4, 103, 77, 88, 0, 16, 22, 10, 8, 10, 4, 103, 77, 92, 0, 16, 22, 10, 8, 10, 4, 103, 77, 132, 0, 16, 22, 10, 8, 10, 4, 103, 77, 148, 0, 16, 22, 10, 8, 10, 4, 103, 77, 220, 0, 16, 22, 10, 8, 10, 4, 103, 78, 56, 0, 16, 22, 10, 8, 10, 4, 103, 78, 60, 0, 16, 22, 10, 8, 10, 4, 103, 78, 64, 0, 16, 22, 10, 8, 10, 4, 103, 78, 68, 0, 16, 22, 10, 8, 10, 4, 103, 78, 124, 0, 16, 22, 10, 8, 10, 4, 103, 78, 172, 0, 16, 22, 10, 8, 10, 4, 103, 78, 176, 0, 16, 22, 10, 8, 10, 4, 103, 78, 196, 0, 16, 22, 10, 8, 10, 4, 103, 78, 228, 0, 16, 22, 10, 8, 10, 4, 103, 79, 24, 0, 16, 22, 10, 8, 10, 4, 103, 79, 28, 0, 16, 22, 10, 8, 10, 4, 103, 79, 36, 0, 16, 22, 10, 8, 10, 4, 103, 79, 40, 0, 16, 22, 10, 8, 10, 4, 103, 79, 44, 0, 16, 22, 10, 8, 10, 4, 103, 79, 52, 0, 16, 22, 10, 8, 10, 4, 103, 79, 56, 0, 16, 22, 10, 8, 10, 4, 103, 79, 60, 0, 16, 22, 10, 8, 10, 4, 103, 79, 64, 0, 16, 22, 10, 8, 10, 4, 103, 79, 68, 0, 16, 22, 10, 8, 10, 4, 103, 79, 80, 0, 16, 22, 10, 8, 10, 4, 103, 79, 84, 0, 16, 22, 10, 8, 10, 4, 103, 79, 120, 0, 16, 22, 10, 8, 10, 4, 103, 79, 136, 0, 16, 22, 10, 8, 10, 4, 103, 79, 188, 0, 16, 22, 10, 8, 10, 4, 103, 79, 192, 0, 16, 22, 10, 8, 10, 4, 103, 79, 196, 0, 16, 22, 10, 8, 10, 4, 103, 79, 200, 0, 16, 22, 10, 8, 10, 4, 103, 79, 204, 0, 16, 22, 10, 8, 10, 4, 103, 79, 208, 0, 16, 22, 10, 8, 10, 4, 103, 79, 212, 0, 16, 22, 10, 8, 10, 4, 103, 79, 240, 0, 16, 22, 10, 8, 10, 4, 103, 80, 24, 0, 16, 22, 10, 8, 10, 4, 103, 80, 28, 0, 16, 22, 10, 8, 10, 4, 103, 80, 44, 0, 16, 22, 10, 8, 10, 4, 103, 80, 72, 0, 16, 22, 10, 8, 10, 4, 103, 80, 176, 0, 16, 22, 10, 8, 10, 4, 103, 80, 180, 0, 16, 22, 10, 8, 10, 4, 103, 80, 184, 0, 16, 22, 10, 8, 10, 4, 103, 80, 192, 0, 16, 22, 10, 8, 10, 4, 103, 80, 200, 0, 16, 22, 10, 8, 10, 4, 103, 80, 212, 0, 16, 22, 10, 8, 10, 4, 103, 80, 232, 0, 16, 22, 10, 8, 10, 4, 103, 81, 4, 0, 16, 22, 10, 8, 10, 4, 103, 81, 8, 0, 16, 22, 10, 8, 10, 4, 103, 81, 16, 0, 16, 22, 10, 8, 10, 4, 103, 81, 20, 0, 16, 22, 10, 8, 10, 4, 103, 81, 44, 0, 16, 22, 10, 8, 10, 4, 103, 81, 48, 0, 16, 22, 10, 8, 10, 4, 103, 81, 96, 0, 16, 22, 10, 8, 10, 4, 103, 81, 120, 0, 16, 22, 10, 8, 10, 4, 103, 81, 148, 0, 16, 22, 10, 8, 10, 4, 103, 81, 164, 0, 16, 22, 10, 8, 10, 4, 103, 81, 168, 0, 16, 22, 10, 8, 10, 4, 103, 81, 183, 0, 16, 24, 10, 8, 10, 4, 103, 81, 184, 0, 16, 22, 10, 8, 10, 4, 103, 81, 200, 0, 16, 22, 10, 8, 10, 4, 103, 81, 232, 0, 16, 22, 10, 8, 10, 4, 103, 82, 52, 0, 16, 22, 10, 8, 10, 4, 103, 82, 60, 0, 16, 22, 10, 8, 10, 4, 103, 82, 68, 0, 16, 22, 10, 8, 10, 4, 103, 82, 84, 0, 16, 22, 10, 8, 10, 4, 103, 82, 104, 0, 16, 22, 10, 8, 10, 4, 103, 82, 224, 0, 16, 22, 10, 8, 10, 4, 103, 82, 236, 0, 16, 22, 10, 8, 10, 4, 103, 83, 44, 0, 16, 22, 10, 8, 10, 4, 103, 83, 52, 0, 16, 22, 10, 8, 10, 4, 103, 83, 60, 0, 16, 22, 10, 8, 10, 4, 103, 83, 64, 0, 16, 22, 10, 8, 10, 4, 103, 83, 72, 0, 16, 22, 10, 8, 10, 4, 103, 83, 112, 0, 16, 22, 10, 8, 10, 4, 103, 83, 120, 0, 16, 22, 10, 8, 10, 4, 103, 83, 180, 0, 16, 22, 10, 8, 10, 4, 103, 84, 0, 0, 16, 22, 10, 8, 10, 4, 103, 84, 12, 0, 16, 22, 10, 8, 10, 4, 103, 84, 16, 0, 16, 22, 10, 8, 10, 4, 103, 84, 20, 0, 16, 22, 10, 8, 10, 4, 103, 84, 24, 0, 16, 22, 10, 8, 10, 4, 103, 84, 28, 0, 16, 22, 10, 8, 10, 4, 103, 84, 48, 0, 16, 22, 10, 8, 10, 4, 103, 84, 56, 0, 16, 22, 10, 8, 10, 4, 103, 84, 64, 0, 16, 22, 10, 8, 10, 4, 103, 84, 72, 0, 16, 22, 10, 8, 10, 4, 103, 84, 92, 0, 16, 22, 10, 8, 10, 4, 103, 84, 108, 0, 16, 22, 10, 8, 10, 4, 103, 84, 136, 0, 16, 22, 10, 8, 10, 4, 103, 85, 20, 0, 16, 22, 10, 8, 10, 4, 103, 85, 24, 0, 16, 22, 10, 8, 10, 4, 103, 85, 44, 0, 16, 22, 10, 8, 10, 4, 103, 85, 48, 0, 16, 22, 10, 8, 10, 4, 103, 85, 52, 0, 16, 22, 10, 8, 10, 4, 103, 85, 56, 0, 16, 22, 10, 8, 10, 4, 103, 85, 84, 0, 16, 22, 10, 8, 10, 4, 103, 85, 136, 0, 16, 22, 10, 8, 10, 4, 103, 85, 144, 0, 16, 22, 10, 8, 10, 4, 103, 85, 164, 0, 16, 22, 10, 8, 10, 4, 103, 85, 168, 0, 16, 22, 10, 8, 10, 4, 103, 85, 172, 0, 16, 22, 10, 8, 10, 4, 103, 85, 176, 0, 16, 22, 10, 8, 10, 4, 103, 85, 224, 0, 16, 22, 10, 8, 10, 4, 103, 86, 28, 0, 16, 22, 10, 8, 10, 4, 103, 86, 32, 0, 16, 22, 10, 8, 10, 4, 103, 86, 44, 0, 16, 22, 10, 8, 10, 4, 103, 86, 60, 0, 16, 22, 10, 8, 10, 4, 103, 86, 68, 0, 16, 22, 10, 8, 10, 4, 103, 86, 80, 0, 16, 22, 10, 8, 10, 4, 103, 86, 84, 0, 16, 22, 10, 8, 10, 4, 103, 86, 88, 0, 16, 22, 10, 8, 10, 4, 103, 86, 129, 0, 16, 24, 10, 8, 10, 4, 103, 86, 204, 0, 16, 22, 10, 8, 10, 4, 103, 86, 208, 0, 16, 22, 10, 8, 10, 4, 103, 86, 212, 0, 16, 22, 10, 8, 10, 4, 103, 86, 216, 0, 16, 22, 10, 8, 10, 4, 103, 86, 220, 0, 16, 22, 10, 8, 10, 4, 103, 86, 224, 0, 16, 22, 10, 8, 10, 4, 103, 86, 228, 0, 16, 22, 10, 8, 10, 4, 103, 86, 232, 0, 16, 22, 10, 8, 10, 4, 103, 86, 236, 0, 16, 22, 10, 8, 10, 4, 103, 86, 240, 0, 16, 22, 10, 8, 10, 4, 103, 86, 244, 0, 16, 22, 10, 8, 10, 4, 103, 86, 248, 0, 16, 22, 10, 8, 10, 4, 103, 86, 252, 0, 16, 22, 10, 8, 10, 4, 103, 87, 0, 0, 16, 22, 10, 8, 10, 4, 103, 87, 4, 0, 16, 22, 10, 8, 10, 4, 103, 87, 20, 0, 16, 22, 10, 8, 10, 4, 103, 87, 32, 0, 16, 22, 10, 8, 10, 4, 103, 87, 72, 0, 16, 22, 10, 8, 10, 4, 103, 87, 96, 0, 16, 22, 10, 8, 10, 4, 103, 87, 132, 0, 16, 22, 10, 8, 10, 4, 103, 87, 180, 0, 16, 22, 10, 8, 10, 4, 103, 87, 224, 0, 16, 22, 10, 8, 10, 4, 103, 88, 4, 0, 16, 22, 10, 8, 10, 4, 103, 88, 8, 0, 16, 22, 10, 8, 10, 4, 103, 88, 12, 0, 16, 22, 10, 8, 10, 4, 103, 88, 16, 0, 16, 22, 10, 8, 10, 4, 103, 88, 20, 0, 16, 22, 10, 8, 10, 4, 103, 88, 32, 0, 16, 22, 10, 8, 10, 4, 103, 88, 36, 0, 16, 22, 10, 8, 10, 4, 103, 88, 60, 0, 16, 22, 10, 8, 10, 4, 103, 88, 64, 0, 16, 22, 10, 8, 10, 4, 103, 88, 72, 0, 16, 22, 10, 8, 10, 4, 103, 88, 96, 0, 16, 22, 10, 8, 10, 4, 103, 88, 100, 0, 16, 22, 10, 8, 10, 4, 103, 88, 139, 0, 16, 24, 10, 8, 10, 4, 103, 88, 152, 0, 16, 23, 10, 8, 10, 4, 103, 88, 164, 0, 16, 22, 10, 8, 10, 4, 103, 88, 176, 0, 16, 22, 10, 8, 10, 4, 103, 88, 184, 0, 16, 22, 10, 8, 10, 4, 103, 88, 188, 0, 16, 22, 10, 8, 10, 4, 103, 88, 212, 0, 16, 22, 10, 8, 10, 4, 103, 89, 28, 0, 16, 22, 10, 8, 10, 4, 103, 89, 96, 0, 16, 22, 10, 8, 10, 4, 103, 89, 100, 0, 16, 22, 10, 8, 10, 4, 103, 89, 104, 0, 16, 22, 10, 8, 10, 4, 103, 89, 108, 0, 16, 22, 10, 8, 10, 4, 103, 89, 112, 0, 16, 22, 10, 8, 10, 4, 103, 89, 116, 0, 16, 22, 10, 8, 10, 4, 103, 89, 148, 0, 16, 22, 10, 8, 10, 4, 103, 89, 172, 0, 16, 22, 10, 8, 10, 4, 103, 89, 184, 0, 16, 22, 10, 8, 10, 4, 103, 89, 188, 0, 16, 22, 10, 8, 10, 4, 103, 89, 192, 0, 16, 22, 10, 8, 10, 4, 103, 89, 196, 0, 16, 22, 10, 8, 10, 4, 103, 89, 200, 0, 16, 22, 10, 8, 10, 4, 103, 89, 204, 0, 16, 22, 10, 8, 10, 4, 103, 89, 208, 0, 16, 22, 10, 8, 10, 4, 103, 89, 212, 0, 16, 22, 10, 8, 10, 4, 103, 89, 216, 0, 16, 22, 10, 8, 10, 4, 103, 89, 220, 0, 16, 22, 10, 8, 10, 4, 103, 89, 224, 0, 16, 22, 10, 8, 10, 4, 103, 89, 228, 0, 16, 22, 10, 8, 10, 4, 103, 90, 52, 0, 16, 22, 10, 8, 10, 4, 103, 90, 92, 0, 16, 22, 10, 8, 10, 4, 103, 90, 100, 0, 16, 22, 10, 8, 10, 4, 103, 90, 104, 0, 16, 22, 10, 8, 10, 4, 103, 90, 108, 0, 16, 22, 10, 8, 10, 4, 103, 90, 112, 0, 16, 22, 10, 8, 10, 4, 103, 90, 116, 0, 16, 22, 10, 8, 10, 4, 103, 90, 120, 0, 16, 22, 10, 8, 10, 4, 103, 90, 124, 0, 16, 22, 10, 8, 10, 4, 103, 90, 128, 0, 16, 22, 10, 8, 10, 4, 103, 90, 132, 0, 16, 22, 10, 8, 10, 4, 103, 90, 152, 0, 16, 22, 10, 8, 10, 4, 103, 90, 168, 0, 16, 22, 10, 8, 10, 4, 103, 90, 173, 0, 16, 24, 10, 8, 10, 4, 103, 90, 176, 0, 16, 22, 10, 8, 10, 4, 103, 90, 188, 0, 16, 22, 10, 8, 10, 4, 103, 90, 192, 0, 16, 22, 10, 8, 10, 4, 103, 91, 36, 0, 16, 22, 10, 8, 10, 4, 103, 91, 40, 0, 16, 22, 10, 8, 10, 4, 103, 91, 108, 0, 16, 22, 10, 8, 10, 4, 103, 91, 152, 0, 16, 22, 10, 8, 10, 4, 103, 91, 176, 0, 16, 22, 10, 8, 10, 4, 103, 91, 200, 0, 16, 22, 10, 8, 10, 4, 103, 91, 208, 0, 16, 22, 10, 8, 10, 4, 103, 91, 212, 0, 16, 22, 10, 8, 10, 4, 103, 91, 219, 0, 16, 24, 10, 8, 10, 4, 103, 91, 236, 0, 16, 22, 10, 8, 10, 4, 103, 91, 252, 0, 16, 22, 10, 8, 10, 4, 103, 92, 0, 0, 16, 22, 10, 8, 10, 4, 103, 92, 4, 0, 16, 22, 10, 8, 10, 4, 103, 92, 8, 0, 16, 22, 10, 8, 10, 4, 103, 92, 12, 0, 16, 22, 10, 8, 10, 4, 103, 92, 48, 0, 16, 22, 10, 8, 10, 4, 103, 92, 52, 0, 16, 22, 10, 8, 10, 4, 103, 92, 56, 0, 16, 22, 10, 8, 10, 4, 103, 92, 60, 0, 16, 22, 10, 8, 10, 4, 103, 92, 64, 0, 16, 22, 10, 8, 10, 4, 103, 92, 68, 0, 16, 22, 10, 8, 10, 4, 103, 92, 72, 0, 16, 22, 10, 8, 10, 4, 103, 92, 76, 0, 16, 22, 10, 8, 10, 4, 103, 92, 80, 0, 16, 22, 10, 8, 10, 4, 103, 92, 86, 0, 16, 24, 10, 8, 10, 4, 103, 92, 88, 0, 16, 22, 10, 8, 10, 4, 103, 92, 108, 0, 16, 22, 10, 8, 10, 4, 103, 92, 124, 0, 16, 22, 10, 8, 10, 4, 103, 92, 128, 0, 16, 24, 10, 8, 10, 4, 103, 92, 132, 0, 16, 22, 10, 8, 10, 4, 103, 92, 156, 0, 16, 22, 10, 8, 10, 4, 103, 92, 164, 0, 16, 22, 10, 8, 10, 4, 103, 92, 168, 0, 16, 22, 10, 8, 10, 4, 103, 92, 172, 0, 16, 22, 10, 8, 10, 4, 103, 92, 176, 0, 16, 22, 10, 8, 10, 4, 103, 92, 180, 0, 16, 22, 10, 8, 10, 4, 103, 92, 184, 0, 16, 22, 10, 8, 10, 4, 103, 92, 188, 0, 16, 22, 10, 8, 10, 4, 103, 92, 192, 0, 16, 22, 10, 8, 10, 4, 103, 92, 236, 0, 16, 22, 10, 8, 10, 4, 103, 92, 240, 0, 16, 22, 10, 8, 10, 4, 103, 92, 244, 0, 16, 22, 10, 8, 10, 4, 103, 92, 248, 0, 16, 22, 10, 8, 10, 4, 103, 92, 252, 0, 16, 22, 10, 8, 10, 4, 103, 93, 0, 0, 16, 22, 10, 8, 10, 4, 103, 93, 4, 0, 16, 22, 10, 8, 10, 4, 103, 93, 28, 0, 16, 22, 10, 8, 10, 4, 103, 93, 76, 0, 16, 22, 10, 8, 10, 4, 103, 93, 84, 0, 16, 22, 10, 8, 10, 4, 103, 93, 121, 0, 16, 24, 10, 8, 10, 4, 103, 93, 152, 0, 16, 22, 10, 8, 10, 4, 103, 93, 180, 0, 16, 22, 10, 8, 10, 4, 103, 93, 204, 0, 16, 22, 10, 8, 10, 4, 103, 94, 12, 0, 16, 22, 10, 8, 10, 4, 103, 94, 20, 0, 16, 22, 10, 8, 10, 4, 103, 94, 28, 0, 16, 22, 10, 8, 10, 4, 103, 94, 32, 0, 16, 22, 10, 8, 10, 4, 103, 94, 36, 0, 16, 22, 10, 8, 10, 4, 103, 94, 40, 0, 16, 22, 10, 8, 10, 4, 103, 94, 44, 0, 16, 22, 10, 8, 10, 4, 103, 94, 72, 0, 16, 22, 10, 8, 10, 4, 103, 94, 88, 0, 16, 22, 10, 8, 10, 4, 103, 94, 116, 0, 16, 22, 10, 8, 10, 4, 103, 94, 160, 0, 16, 22, 10, 8, 10, 4, 103, 94, 180, 0, 16, 22, 10, 8, 10, 4, 103, 94, 200, 0, 16, 22, 10, 8, 10, 4, 103, 95, 28, 0, 16, 22, 10, 8, 10, 4, 103, 95, 52, 0, 16, 22, 10, 8, 10, 4, 103, 95, 64, 0, 16, 22, 10, 8, 10, 4, 103, 95, 68, 0, 16, 22, 10, 8, 10, 4, 103, 95, 88, 0, 16, 22, 10, 8, 10, 4, 103, 95, 92, 0, 16, 22, 10, 8, 10, 4, 103, 95, 116, 0, 16, 22, 10, 8, 10, 4, 103, 95, 128, 0, 16, 22, 10, 8, 10, 4, 103, 95, 136, 0, 16, 22, 10, 8, 10, 4, 103, 95, 140, 0, 16, 22, 10, 8, 10, 4, 103, 95, 144, 0, 16, 22, 10, 8, 10, 4, 103, 95, 152, 0, 16, 22, 10, 8, 10, 4, 103, 95, 207, 0, 16, 24, 10, 8, 10, 4, 103, 95, 216, 0, 16, 22, 10, 8, 10, 4, 103, 95, 220, 0, 16, 22, 10, 8, 10, 4, 103, 95, 224, 0, 16, 22, 10, 8, 10, 4, 103, 95, 236, 0, 16, 22, 10, 8, 10, 4, 103, 95, 240, 0, 16, 22, 10, 8, 10, 4, 103, 95, 244, 0, 16, 22, 10, 8, 10, 4, 103, 95, 248, 0, 16, 22, 10, 8, 10, 4, 103, 95, 252, 0, 16, 22, 10, 8, 10, 4, 103, 96, 0, 0, 16, 22, 10, 8, 10, 4, 103, 96, 8, 0, 16, 22, 10, 8, 10, 4, 103, 96, 80, 0, 16, 22, 10, 8, 10, 4, 103, 96, 124, 0, 16, 22, 10, 8, 10, 4, 103, 96, 136, 0, 16, 22, 10, 8, 10, 4, 103, 96, 140, 0, 16, 24, 10, 8, 10, 4, 103, 96, 148, 0, 16, 22, 10, 8, 10, 4, 103, 96, 152, 0, 16, 22, 10, 8, 10, 4, 103, 96, 156, 0, 16, 22, 10, 8, 10, 4, 103, 96, 160, 0, 16, 22, 10, 8, 10, 4, 103, 96, 164, 0, 16, 22, 10, 8, 10, 4, 103, 96, 168, 0, 16, 22, 10, 8, 10, 4, 103, 96, 172, 0, 16, 22, 10, 8, 10, 4, 103, 96, 176, 0, 16, 22, 10, 8, 10, 4, 103, 96, 180, 0, 16, 22, 10, 8, 10, 4, 103, 96, 184, 0, 16, 22, 10, 8, 10, 4, 103, 96, 188, 0, 16, 22, 10, 8, 10, 4, 103, 96, 192, 0, 16, 22, 10, 8, 10, 4, 103, 96, 196, 0, 16, 22, 10, 8, 10, 4, 103, 96, 200, 0, 16, 22, 10, 8, 10, 4, 103, 96, 204, 0, 16, 22, 10, 8, 10, 4, 103, 96, 208, 0, 16, 22, 10, 8, 10, 4, 103, 96, 212, 0, 16, 22, 10, 8, 10, 4, 103, 96, 216, 0, 16, 22, 10, 8, 10, 4, 103, 97, 8, 0, 16, 22, 10, 8, 10, 4, 103, 97, 12, 0, 16, 22, 10, 8, 10, 4, 103, 97, 16, 0, 16, 22, 10, 8, 10, 4, 103, 97, 20, 0, 16, 22, 10, 8, 10, 4, 103, 97, 24, 0, 16, 22, 10, 8, 10, 4, 103, 97, 28, 0, 16, 22, 10, 8, 10, 4, 103, 97, 32, 0, 16, 22, 10, 8, 10, 4, 103, 97, 36, 0, 16, 22, 10, 8, 10, 4, 103, 97, 40, 0, 16, 22, 10, 8, 10, 4, 103, 97, 56, 0, 16, 22, 10, 8, 10, 4, 103, 97, 60, 0, 16, 22, 10, 8, 10, 4, 103, 97, 64, 0, 16, 22, 10, 8, 10, 4, 103, 97, 68, 0, 16, 22, 10, 8, 10, 4, 103, 97, 72, 0, 16, 22, 10, 8, 10, 4, 103, 97, 80, 0, 16, 22, 10, 8, 10, 4, 103, 97, 112, 0, 16, 22, 10, 8, 10, 4, 103, 97, 116, 0, 16, 22, 10, 8, 10, 4, 103, 97, 128, 0, 16, 22, 10, 8, 10, 4, 103, 97, 144, 0, 16, 22, 10, 8, 10, 4, 103, 97, 148, 0, 16, 22, 10, 8, 10, 4, 103, 97, 188, 0, 16, 22, 10, 8, 10, 4, 103, 97, 192, 0, 16, 22, 10, 8, 10, 4, 103, 97, 224, 0, 16, 22, 10, 8, 10, 4, 103, 97, 228, 0, 16, 23, 10, 8, 10, 4, 103, 98, 28, 0, 16, 23, 10, 8, 10, 4, 103, 98, 40, 0, 16, 22, 10, 8, 10, 4, 103, 98, 44, 0, 16, 22, 10, 8, 10, 4, 103, 98, 48, 0, 16, 22, 10, 8, 10, 4, 103, 98, 56, 0, 16, 22, 10, 8, 10, 4, 103, 98, 80, 0, 16, 22, 10, 8, 10, 4, 103, 98, 88, 0, 16, 22, 10, 8, 10, 4, 103, 98, 92, 0, 16, 22, 10, 8, 10, 4, 103, 98, 96, 0, 16, 22, 10, 8, 10, 4, 103, 98, 100, 0, 16, 22, 10, 8, 10, 4, 103, 98, 124, 0, 16, 22, 10, 8, 10, 4, 103, 98, 136, 0, 16, 22, 10, 8, 10, 4, 103, 98, 140, 0, 16, 22, 10, 8, 10, 4, 103, 98, 144, 0, 16, 22, 10, 8, 10, 4, 103, 98, 164, 0, 16, 22, 10, 8, 10, 4, 103, 98, 168, 0, 16, 22, 10, 8, 10, 4, 103, 98, 180, 0, 16, 22, 10, 8, 10, 4, 103, 98, 196, 0, 16, 22, 10, 8, 10, 4, 103, 98, 216, 0, 16, 22, 10, 8, 10, 4, 103, 98, 220, 0, 16, 22, 10, 8, 10, 4, 103, 98, 224, 0, 16, 22, 10, 8, 10, 4, 103, 98, 228, 0, 16, 22, 10, 8, 10, 4, 103, 98, 232, 0, 16, 22, 10, 8, 10, 4, 103, 98, 240, 0, 16, 22, 10, 8, 10, 4, 103, 98, 244, 0, 16, 22, 10, 8, 10, 4, 103, 98, 248, 0, 16, 22, 10, 8, 10, 4, 103, 98, 252, 0, 16, 22, 10, 8, 10, 4, 103, 99, 40, 0, 16, 23, 10, 8, 10, 4, 103, 99, 52, 0, 16, 22, 10, 8, 10, 4, 103, 99, 56, 0, 16, 22, 10, 8, 10, 4, 103, 99, 60, 0, 16, 22, 10, 8, 10, 4, 103, 99, 76, 0, 16, 22, 10, 8, 10, 4, 103, 99, 104, 0, 16, 22, 10, 8, 10, 4, 103, 99, 116, 0, 16, 22, 10, 8, 10, 4, 103, 99, 120, 0, 16, 22, 10, 8, 10, 4, 103, 99, 132, 0, 16, 22, 10, 8, 10, 4, 103, 99, 136, 0, 16, 22, 10, 8, 10, 4, 103, 99, 140, 0, 16, 22, 10, 8, 10, 4, 103, 99, 144, 0, 16, 22, 10, 8, 10, 4, 103, 99, 152, 0, 16, 22, 10, 8, 10, 4, 103, 99, 220, 0, 16, 22, 10, 8, 10, 4, 103, 99, 232, 0, 16, 22, 10, 8, 10, 4, 103, 99, 236, 0, 16, 22, 10, 8, 10, 4, 103, 100, 0, 0, 16, 22, 10, 8, 10, 4, 103, 100, 32, 0, 16, 22, 10, 8, 10, 4, 103, 100, 40, 0, 16, 22, 10, 8, 10, 4, 103, 100, 48, 0, 16, 22, 10, 8, 10, 4, 103, 100, 52, 0, 16, 22, 10, 8, 10, 4, 103, 100, 56, 0, 16, 22, 10, 8, 10, 4, 103, 100, 60, 0, 16, 22, 10, 8, 10, 4, 103, 100, 64, 0, 16, 22, 10, 8, 10, 4, 103, 100, 68, 0, 16, 22, 10, 8, 10, 4, 103, 100, 88, 0, 16, 22, 10, 8, 10, 4, 103, 100, 116, 0, 16, 22, 10, 8, 10, 4, 103, 100, 140, 0, 16, 22, 10, 8, 10, 4, 103, 100, 144, 0, 16, 22, 10, 8, 10, 4, 103, 100, 236, 0, 16, 22, 10, 8, 10, 4, 103, 100, 240, 0, 16, 22, 10, 8, 10, 4, 103, 100, 248, 0, 16, 22, 10, 8, 10, 4, 103, 100, 252, 0, 16, 22, 10, 8, 10, 4, 103, 101, 4, 0, 16, 22, 10, 8, 10, 4, 103, 101, 8, 0, 16, 22, 10, 8, 10, 4, 103, 101, 12, 0, 16, 22, 10, 8, 10, 4, 103, 101, 28, 0, 16, 22, 10, 8, 10, 4, 103, 101, 60, 0, 16, 22, 10, 8, 10, 4, 103, 101, 120, 0, 16, 22, 10, 8, 10, 4, 103, 101, 124, 0, 16, 22, 10, 8, 10, 4, 103, 192, 0, 0, 16, 22, 10, 8, 10, 4, 103, 192, 4, 0, 16, 22, 10, 8, 10, 4, 103, 192, 8, 0, 16, 22, 10, 8, 10, 4, 103, 192, 12, 0, 16, 22, 10, 8, 10, 4, 103, 192, 16, 0, 16, 22, 10, 8, 10, 4, 103, 192, 20, 0, 16, 22, 10, 8, 10, 4, 103, 192, 24, 0, 16, 22, 10, 8, 10, 4, 103, 192, 28, 0, 16, 22, 10, 8, 10, 4, 103, 192, 48, 0, 16, 22, 10, 8, 10, 4, 103, 192, 52, 0, 16, 22, 10, 8, 10, 4, 103, 192, 56, 0, 16, 22, 10, 8, 10, 4, 103, 192, 84, 0, 16, 22, 10, 8, 10, 4, 103, 192, 88, 0, 16, 22, 10, 8, 10, 4, 103, 192, 92, 0, 16, 22, 10, 8, 10, 4, 103, 192, 96, 0, 16, 22, 10, 8, 10, 4, 103, 192, 100, 0, 16, 22, 10, 8, 10, 4, 103, 192, 104, 0, 16, 22, 10, 8, 10, 4, 103, 192, 108, 0, 16, 22, 10, 8, 10, 4, 103, 192, 112, 0, 16, 22, 10, 8, 10, 4, 103, 192, 128, 0, 16, 22, 10, 8, 10, 4, 103, 192, 132, 0, 16, 22, 10, 8, 10, 4, 103, 192, 136, 0, 16, 22, 10, 8, 10, 4, 103, 192, 140, 0, 16, 22, 10, 8, 10, 4, 103, 192, 144, 0, 16, 22, 10, 8, 10, 4, 103, 192, 164, 0, 16, 22, 10, 8, 10, 4, 103, 192, 188, 0, 16, 22, 10, 8, 10, 4, 103, 192, 208, 0, 16, 22, 10, 8, 10, 4, 103, 192, 212, 0, 16, 22, 10, 8, 10, 4, 103, 192, 216, 0, 16, 22, 10, 8, 10, 4, 103, 192, 252, 0, 16, 22, 10, 8, 10, 4, 103, 193, 40, 0, 16, 22, 10, 8, 10, 4, 103, 193, 44, 0, 16, 22, 10, 8, 10, 4, 103, 193, 120, 0, 16, 22, 10, 8, 10, 4, 103, 193, 124, 0, 16, 22, 10, 8, 10, 4, 103, 193, 140, 0, 16, 22, 10, 8, 10, 4, 103, 193, 144, 0, 16, 22, 10, 8, 10, 4, 103, 193, 148, 0, 16, 22, 10, 8, 10, 4, 103, 193, 160, 0, 16, 22, 10, 8, 10, 4, 103, 193, 188, 0, 16, 22, 10, 8, 10, 4, 103, 193, 192, 0, 16, 22, 10, 8, 10, 4, 103, 193, 212, 0, 16, 22, 10, 8, 10, 4, 103, 193, 216, 0, 16, 22, 10, 8, 10, 4, 103, 193, 220, 0, 16, 22, 10, 8, 10, 4, 103, 193, 224, 0, 16, 22, 10, 8, 10, 4, 103, 193, 228, 0, 16, 22, 10, 8, 10, 4, 103, 193, 232, 0, 16, 22, 10, 8, 10, 4, 103, 193, 236, 0, 16, 22, 10, 8, 10, 4, 103, 193, 240, 0, 16, 22, 10, 8, 10, 4, 103, 194, 16, 0, 16, 22, 10, 8, 10, 4, 103, 195, 104, 0, 16, 22, 10, 8, 10, 4, 103, 195, 112, 0, 16, 22, 10, 8, 10, 4, 103, 195, 136, 0, 16, 22, 10, 8, 10, 4, 103, 195, 148, 0, 16, 22, 10, 8, 10, 4, 103, 195, 152, 0, 16, 22, 10, 8, 10, 4, 103, 195, 160, 0, 16, 22, 10, 8, 10, 4, 103, 195, 192, 0, 16, 22, 10, 8, 10, 4, 103, 196, 60, 0, 16, 22, 10, 8, 10, 4, 103, 196, 64, 0, 16, 22, 10, 8, 10, 4, 103, 196, 72, 0, 16, 22, 10, 8, 10, 4, 103, 196, 88, 0, 16, 22, 10, 8, 10, 4, 103, 196, 92, 0, 16, 22, 10, 8, 10, 4, 103, 196, 96, 0, 16, 22, 10, 8, 10, 4, 103, 196, 168, 0, 16, 22, 10, 8, 10, 4, 103, 196, 204, 0, 16, 22, 10, 8, 10, 4, 103, 197, 180, 0, 16, 22, 10, 8, 10, 4, 103, 197, 228, 0, 16, 22, 10, 8, 10, 4, 103, 198, 20, 0, 16, 22, 10, 8, 10, 4, 103, 198, 60, 0, 16, 22, 10, 8, 10, 4, 103, 198, 64, 0, 16, 22, 10, 8, 10, 4, 103, 198, 72, 0, 16, 22, 10, 8, 10, 4, 103, 198, 124, 0, 16, 22, 10, 8, 10, 4, 103, 198, 156, 0, 16, 22, 10, 8, 10, 4, 103, 198, 180, 0, 16, 22, 10, 8, 10, 4, 103, 198, 196, 0, 16, 22, 10, 8, 10, 4, 103, 198, 200, 0, 16, 22, 10, 8, 10, 4, 103, 198, 216, 0, 16, 22, 10, 8, 10, 4, 103, 198, 220, 0, 16, 22, 10, 8, 10, 4, 103, 198, 224, 0, 16, 22, 10, 8, 10, 4, 103, 198, 228, 0, 16, 22, 10, 8, 10, 4, 103, 198, 232, 0, 16, 22, 10, 8, 10, 4, 103, 198, 236, 0, 16, 22, 10, 8, 10, 4, 103, 198, 240, 0, 16, 22, 10, 8, 10, 4, 103, 198, 244, 0, 16, 22, 10, 8, 10, 4, 103, 199, 164, 0, 16, 22, 10, 8, 10, 4, 103, 199, 196, 0, 16, 22, 10, 8, 10, 4, 103, 199, 228, 0, 16, 22, 10, 8, 10, 4, 103, 199, 248, 0, 16, 22, 10, 8, 10, 4, 103, 199, 252, 0, 16, 22, 10, 8, 10, 4, 103, 200, 28, 0, 16, 22, 10, 8, 10, 4, 103, 200, 32, 0, 16, 22, 10, 8, 10, 4, 103, 200, 52, 0, 16, 22, 10, 8, 10, 4, 103, 200, 64, 0, 16, 22, 10, 8, 10, 4, 103, 200, 68, 0, 16, 22, 10, 8, 10, 4, 103, 200, 136, 0, 16, 22, 10, 8, 10, 4, 103, 200, 140, 0, 16, 22, 10, 8, 10, 4, 103, 200, 144, 0, 16, 22, 10, 8, 10, 4, 103, 200, 148, 0, 16, 22, 10, 8, 10, 4, 103, 200, 152, 0, 16, 22, 10, 8, 10, 4, 103, 200, 156, 0, 16, 22, 10, 8, 10, 4, 103, 200, 160, 0, 16, 22, 10, 8, 10, 4, 103, 200, 164, 0, 16, 22, 10, 8, 10, 4, 103, 200, 168, 0, 16, 22, 10, 8, 10, 4, 103, 200, 172, 0, 16, 22, 10, 8, 10, 4, 103, 200, 176, 0, 16, 22, 10, 8, 10, 4, 103, 200, 180, 0, 16, 22, 10, 8, 10, 4, 103, 200, 184, 0, 16, 22, 10, 8, 10, 4, 103, 200, 188, 0, 16, 22, 10, 8, 10, 4, 103, 200, 192, 0, 16, 22, 10, 8, 10, 4, 103, 200, 220, 0, 16, 22, 10, 8, 10, 4, 103, 200, 224, 0, 16, 22, 10, 8, 10, 4, 103, 200, 228, 0, 16, 22, 10, 8, 10, 4, 103, 200, 232, 0, 16, 22, 10, 8, 10, 4, 103, 200, 236, 0, 16, 22, 10, 8, 10, 4, 103, 200, 240, 0, 16, 22, 10, 8, 10, 4, 103, 200, 244, 0, 16, 22, 10, 8, 10, 4, 103, 200, 248, 0, 16, 22, 10, 8, 10, 4, 103, 200, 252, 0, 16, 22, 10, 8, 10, 4, 103, 201, 0, 0, 16, 22, 10, 8, 10, 4, 103, 201, 4, 0, 16, 22, 10, 8, 10, 4, 103, 201, 8, 0, 16, 22, 10, 8, 10, 4, 103, 201, 12, 0, 16, 22, 10, 8, 10, 4, 103, 201, 16, 0, 16, 22, 10, 8, 10, 4, 103, 201, 20, 0, 16, 22, 10, 8, 10, 4, 103, 201, 28, 0, 16, 22, 10, 8, 10, 4, 103, 201, 32, 0, 16, 22, 10, 8, 10, 4, 103, 201, 36, 0, 16, 22, 10, 8, 10, 4, 103, 201, 40, 0, 16, 22, 10, 8, 10, 4, 103, 201, 44, 0, 16, 22, 10, 8, 10, 4, 103, 201, 48, 0, 16, 22, 10, 8, 10, 4, 103, 201, 52, 0, 16, 22, 10, 8, 10, 4, 103, 201, 56, 0, 16, 22, 10, 8, 10, 4, 103, 201, 60, 0, 16, 22, 10, 8, 10, 4, 103, 201, 64, 0, 16, 22, 10, 8, 10, 4, 103, 201, 76, 0, 16, 22, 10, 8, 10, 4, 103, 201, 80, 0, 16, 22, 10, 8, 10, 4, 103, 201, 84, 0, 16, 22, 10, 8, 10, 4, 103, 201, 88, 0, 16, 22, 10, 8, 10, 4, 103, 201, 92, 0, 16, 22, 10, 8, 10, 4, 103, 201, 96, 0, 16, 22, 10, 8, 10, 4, 103, 201, 100, 0, 16, 22, 10, 8, 10, 4, 103, 201, 104, 0, 16, 22, 10, 8, 10, 4, 103, 201, 108, 0, 16, 22, 10, 8, 10, 4, 103, 201, 112, 0, 16, 22, 10, 8, 10, 4, 103, 201, 116, 0, 16, 22, 10, 8, 10, 4, 103, 201, 120, 0, 16, 22, 10, 8, 10, 4, 103, 201, 152, 0, 16, 22, 10, 8, 10, 4, 103, 201, 156, 0, 16, 22, 10, 8, 10, 4, 103, 201, 160, 0, 16, 22, 10, 8, 10, 4, 103, 201, 164, 0, 16, 22, 10, 8, 10, 4, 103, 201, 168, 0, 16, 22, 10, 8, 10, 4, 103, 201, 172, 0, 16, 22, 10, 8, 10, 4, 103, 201, 176, 0, 16, 22, 10, 8, 10, 4, 103, 201, 180, 0, 16, 22, 10, 8, 10, 4, 103, 201, 184, 0, 16, 22, 10, 8, 10, 4, 103, 201, 188, 0, 16, 22, 10, 8, 10, 4, 103, 201, 192, 0, 16, 22, 10, 8, 10, 4, 103, 201, 196, 0, 16, 22, 10, 8, 10, 4, 103, 201, 200, 0, 16, 22, 10, 8, 10, 4, 103, 201, 204, 0, 16, 22, 10, 8, 10, 4, 103, 201, 208, 0, 16, 22, 10, 8, 10, 4, 103, 201, 212, 0, 16, 22, 10, 8, 10, 4, 103, 201, 216, 0, 16, 22, 10, 8, 10, 4, 103, 201, 220, 0, 16, 22, 10, 8, 10, 4, 103, 201, 224, 0, 16, 22, 10, 8, 10, 4, 103, 201, 228, 0, 16, 22, 10, 8, 10, 4, 103, 201, 232, 0, 16, 22, 10, 8, 10, 4, 103, 201, 236, 0, 16, 22, 10, 8, 10, 4, 103, 201, 240, 0, 16, 22, 10, 8, 10, 4, 103, 201, 244, 0, 16, 22, 10, 8, 10, 4, 103, 201, 248, 0, 16, 22, 10, 8, 10, 4, 103, 201, 252, 0, 16, 22, 10, 8, 10, 4, 103, 202, 0, 0, 16, 22, 10, 8, 10, 4, 103, 202, 4, 0, 16, 22, 10, 8, 10, 4, 103, 202, 8, 0, 16, 22, 10, 8, 10, 4, 103, 202, 12, 0, 16, 22, 10, 8, 10, 4, 103, 202, 16, 0, 16, 22, 10, 8, 10, 4, 103, 202, 20, 0, 16, 22, 10, 8, 10, 4, 103, 202, 24, 0, 16, 22, 10, 8, 10, 4, 103, 202, 28, 0, 16, 22, 10, 8, 10, 4, 103, 202, 32, 0, 16, 22, 10, 8, 10, 4, 103, 202, 36, 0, 16, 22, 10, 8, 10, 4, 103, 202, 40, 0, 16, 22, 10, 8, 10, 4, 103, 202, 44, 0, 16, 22, 10, 8, 10, 4, 103, 202, 56, 0, 16, 22, 10, 8, 10, 4, 103, 202, 60, 0, 16, 22, 10, 8, 10, 4, 103, 202, 64, 0, 16, 22, 10, 8, 10, 4, 103, 202, 68, 0, 16, 22, 10, 8, 10, 4, 103, 202, 72, 0, 16, 22, 10, 8, 10, 4, 103, 202, 76, 0, 16, 22, 10, 8, 10, 4, 103, 202, 80, 0, 16, 22, 10, 8, 10, 4, 103, 202, 84, 0, 16, 22, 10, 8, 10, 4, 103, 202, 88, 0, 16, 22, 10, 8, 10, 4, 103, 202, 92, 0, 16, 22, 10, 8, 10, 4, 103, 202, 96, 0, 16, 22, 10, 8, 10, 4, 103, 202, 100, 0, 16, 22, 10, 8, 10, 4, 103, 202, 104, 0, 16, 22, 10, 8, 10, 4, 103, 202, 108, 0, 16, 22, 10, 8, 10, 4, 103, 202, 112, 0, 16, 22, 10, 8, 10, 4, 103, 202, 116, 0, 16, 22, 10, 8, 10, 4, 103, 202, 120, 0, 16, 22, 10, 8, 10, 4, 103, 202, 124, 0, 16, 22, 10, 8, 10, 4, 103, 202, 128, 0, 16, 22, 10, 8, 10, 4, 103, 202, 132, 0, 16, 22, 10, 8, 10, 4, 103, 202, 136, 0, 16, 22, 10, 8, 10, 4, 103, 202, 140, 0, 16, 22, 10, 8, 10, 4, 103, 202, 144, 0, 16, 22, 10, 8, 10, 4, 103, 202, 152, 0, 16, 22, 10, 8, 10, 4, 103, 202, 156, 0, 16, 22, 10, 8, 10, 4, 103, 202, 160, 0, 16, 22, 10, 8, 10, 4, 103, 202, 164, 0, 16, 22, 10, 8, 10, 4, 103, 202, 168, 0, 16, 22, 10, 8, 10, 4, 103, 202, 172, 0, 16, 22, 10, 8, 10, 4, 103, 202, 176, 0, 16, 22, 10, 8, 10, 4, 103, 202, 180, 0, 16, 22, 10, 8, 10, 4, 103, 202, 184, 0, 16, 22, 10, 8, 10, 4, 103, 202, 188, 0, 16, 22, 10, 8, 10, 4, 103, 202, 192, 0, 16, 22, 10, 8, 10, 4, 103, 202, 196, 0, 16, 22, 10, 8, 10, 4, 103, 202, 200, 0, 16, 21, 10, 8, 10, 4, 103, 202, 212, 0, 16, 22, 10, 8, 10, 4, 103, 202, 228, 0, 16, 22, 10, 8, 10, 4, 103, 202, 236, 0, 16, 22, 10, 8, 10, 4, 103, 202, 240, 0, 16, 22, 10, 8, 10, 4, 103, 202, 244, 0, 16, 22, 10, 8, 10, 4, 103, 202, 248, 0, 16, 22, 10, 8, 10, 4, 103, 202, 252, 0, 16, 22, 10, 8, 10, 4, 103, 203, 0, 0, 16, 22, 10, 8, 10, 4, 103, 203, 4, 0, 16, 22, 10, 8, 10, 4, 103, 203, 8, 0, 16, 22, 10, 8, 10, 4, 103, 203, 12, 0, 16, 22, 10, 8, 10, 4, 103, 203, 16, 0, 16, 22, 10, 8, 10, 4, 103, 203, 20, 0, 16, 22, 10, 8, 10, 4, 103, 203, 24, 0, 16, 22, 10, 8, 10, 4, 103, 203, 28, 0, 16, 22, 10, 8, 10, 4, 103, 203, 32, 0, 16, 22, 10, 8, 10, 4, 103, 203, 52, 0, 16, 22, 10, 8, 10, 4, 103, 203, 56, 0, 16, 22, 10, 8, 10, 4, 103, 203, 96, 0, 16, 22, 10, 8, 10, 4, 103, 203, 100, 0, 16, 22, 10, 8, 10, 4, 103, 203, 104, 0, 16, 22, 10, 8, 10, 4, 103, 203, 108, 0, 16, 22, 10, 8, 10, 4, 103, 203, 112, 0, 16, 22, 10, 8, 10, 4, 103, 203, 116, 0, 16, 22, 10, 8, 10, 4, 103, 203, 120, 0, 16, 22, 10, 8, 10, 4, 103, 203, 124, 0, 16, 22, 10, 8, 10, 4, 103, 203, 128, 0, 16, 22, 10, 8, 10, 4, 103, 203, 140, 0, 16, 22, 10, 8, 10, 4, 103, 203, 164, 0, 16, 22, 10, 8, 10, 4, 103, 203, 168, 0, 16, 22, 10, 8, 10, 4, 103, 203, 192, 0, 16, 22, 10, 8, 10, 4, 103, 203, 200, 0, 16, 22, 10, 8, 10, 4, 103, 203, 212, 0, 16, 22, 10, 8, 10, 4, 103, 203, 216, 0, 16, 22, 10, 8, 10, 4, 103, 204, 24, 0, 16, 22, 10, 8, 10, 4, 103, 204, 72, 0, 16, 22, 10, 8, 10, 4, 103, 204, 88, 0, 16, 22, 10, 8, 10, 4, 103, 204, 112, 0, 16, 22, 10, 8, 10, 4, 103, 204, 136, 0, 16, 22, 10, 8, 10, 4, 103, 204, 140, 0, 16, 22, 10, 8, 10, 4, 103, 204, 144, 0, 16, 22, 10, 8, 10, 4, 103, 204, 148, 0, 16, 22, 10, 8, 10, 4, 103, 204, 152, 0, 16, 22, 10, 8, 10, 4, 103, 204, 196, 0, 16, 22, 10, 8, 10, 4, 103, 204, 232, 0, 16, 22, 10, 8, 10, 4, 103, 204, 236, 0, 16, 22, 10, 8, 10, 4, 103, 205, 4, 0, 16, 22, 10, 8, 10, 4, 103, 205, 8, 0, 16, 22, 10, 8, 10, 4, 103, 205, 40, 0, 16, 22, 10, 8, 10, 4, 103, 205, 44, 0, 16, 22, 10, 8, 10, 4, 103, 205, 52, 0, 16, 22, 10, 8, 10, 4, 103, 205, 108, 0, 16, 22, 10, 8, 10, 4, 103, 205, 116, 0, 16, 22, 10, 8, 10, 4, 103, 205, 120, 0, 16, 22, 10, 8, 10, 4, 103, 205, 136, 0, 16, 22, 10, 8, 10, 4, 103, 205, 162, 0, 16, 24, 10, 8, 10, 4, 103, 205, 188, 0, 16, 22, 10, 8, 10, 4, 103, 205, 192, 0, 16, 22, 10, 8, 10, 4, 103, 205, 196, 0, 16, 22, 10, 8, 10, 4, 103, 205, 200, 0, 16, 22, 10, 8, 10, 4, 103, 205, 236, 0, 16, 22, 10, 8, 10, 4, 103, 205, 248, 0, 16, 22, 10, 8, 10, 4, 103, 205, 252, 0, 16, 22, 10, 8, 10, 4, 103, 206, 0, 0, 16, 22, 10, 8, 10, 4, 103, 206, 44, 0, 16, 22, 10, 8, 10, 4, 103, 206, 108, 0, 16, 22, 10, 8, 10, 4, 103, 206, 148, 0, 16, 22, 10, 8, 10, 4, 103, 207, 48, 0, 16, 22, 10, 8, 10, 4, 103, 207, 104, 0, 16, 22, 10, 8, 10, 4, 103, 207, 164, 0, 16, 22, 10, 8, 10, 4, 103, 207, 184, 0, 16, 22, 10, 8, 10, 4, 103, 207, 188, 0, 16, 22, 10, 8, 10, 4, 103, 207, 192, 0, 16, 22, 10, 8, 10, 4, 103, 207, 196, 0, 16, 22, 10, 8, 10, 4, 103, 207, 200, 0, 16, 22, 10, 8, 10, 4, 103, 207, 204, 0, 16, 22, 10, 8, 10, 4, 103, 207, 208, 0, 16, 22, 10, 8, 10, 4, 103, 207, 212, 0, 16, 22, 10, 8, 10, 4, 103, 207, 220, 0, 16, 22, 10, 8, 10, 4, 103, 207, 228, 0, 16, 22, 10, 8, 10, 4, 103, 207, 232, 0, 16, 22, 10, 8, 10, 4, 103, 208, 12, 0, 16, 22, 10, 8, 10, 4, 103, 208, 16, 0, 16, 22, 10, 8, 10, 4, 103, 208, 28, 0, 16, 22, 10, 8, 10, 4, 103, 208, 40, 0, 16, 22, 10, 8, 10, 4, 103, 208, 44, 0, 16, 22, 10, 8, 10, 4, 103, 208, 48, 0, 16, 22, 10, 8, 10, 4, 103, 208, 148, 0, 16, 22, 10, 8, 10, 4, 103, 209, 112, 0, 16, 22, 10, 8, 10, 4, 103, 209, 136, 0, 16, 22, 10, 8, 10, 4, 103, 209, 200, 0, 16, 22, 10, 8, 10, 4, 103, 209, 208, 0, 16, 22, 10, 8, 10, 4, 103, 209, 216, 0, 16, 22, 10, 8, 10, 4, 103, 210, 0, 0, 16, 22, 10, 8, 10, 4, 103, 210, 20, 0, 16, 22, 10, 8, 10, 4, 103, 210, 96, 0, 16, 22, 10, 8, 10, 4, 103, 210, 156, 0, 16, 22, 10, 8, 10, 4, 103, 210, 160, 0, 16, 22, 10, 8, 10, 4, 103, 210, 164, 0, 16, 22, 10, 8, 10, 4, 103, 210, 168, 0, 16, 22, 10, 8, 10, 4, 103, 210, 172, 0, 16, 22, 10, 8, 10, 4, 103, 210, 176, 0, 16, 22, 10, 8, 10, 4, 103, 210, 180, 0, 16, 22, 10, 8, 10, 4, 103, 210, 184, 0, 16, 22, 10, 8, 10, 4, 103, 210, 188, 0, 16, 22, 10, 8, 10, 4, 103, 210, 216, 0, 16, 22, 10, 8, 10, 4, 103, 211, 44, 0, 16, 22, 10, 8, 10, 4, 103, 211, 96, 0, 16, 22, 10, 8, 10, 4, 103, 211, 100, 0, 16, 22, 10, 8, 10, 4, 103, 211, 156, 0, 16, 22, 10, 8, 10, 4, 103, 211, 164, 0, 16, 22, 10, 8, 10, 4, 103, 211, 168, 0, 16, 22, 10, 8, 10, 4, 103, 211, 192, 0, 16, 22, 10, 8, 10, 4, 103, 211, 220, 0, 16, 22, 10, 8, 10, 4, 103, 211, 224, 0, 16, 22, 10, 8, 10, 4, 103, 211, 228, 0, 16, 22, 10, 8, 10, 4, 103, 211, 248, 0, 16, 22, 10, 8, 10, 4, 103, 212, 0, 0, 16, 22, 10, 8, 10, 4, 103, 212, 4, 0, 16, 22, 10, 8, 10, 4, 103, 212, 8, 0, 16, 22, 10, 8, 10, 4, 103, 212, 12, 0, 16, 22, 10, 8, 10, 4, 103, 212, 32, 0, 16, 22, 10, 8, 10, 4, 103, 212, 44, 0, 16, 22, 10, 8, 10, 4, 103, 212, 48, 0, 16, 22, 10, 8, 10, 4, 103, 212, 84, 0, 16, 22, 10, 8, 10, 4, 103, 212, 100, 0, 16, 22, 10, 8, 10, 4, 103, 212, 104, 0, 16, 22, 10, 8, 10, 4, 103, 212, 108, 0, 16, 22, 10, 8, 10, 4, 103, 212, 148, 0, 16, 22, 10, 8, 10, 4, 103, 212, 164, 0, 16, 22, 10, 8, 10, 4, 103, 212, 196, 0, 16, 22, 10, 8, 10, 4, 103, 212, 200, 0, 16, 22, 10, 8, 10, 4, 103, 212, 228, 0, 16, 22, 10, 8, 10, 4, 103, 212, 252, 0, 16, 22, 10, 8, 10, 4, 103, 213, 40, 0, 16, 22, 10, 8, 10, 4, 103, 213, 44, 0, 16, 22, 10, 8, 10, 4, 103, 213, 48, 0, 16, 22, 10, 8, 10, 4, 103, 213, 52, 0, 16, 22, 10, 8, 10, 4, 103, 213, 56, 0, 16, 22, 10, 8, 10, 4, 103, 213, 60, 0, 16, 22, 10, 8, 10, 4, 103, 213, 64, 0, 16, 22, 10, 8, 10, 4, 103, 213, 68, 0, 16, 22, 10, 8, 10, 4, 103, 213, 72, 0, 16, 22, 10, 8, 10, 4, 103, 213, 76, 0, 16, 22, 10, 8, 10, 4, 103, 213, 80, 0, 16, 22, 10, 8, 10, 4, 103, 213, 84, 0, 16, 22, 10, 8, 10, 4, 103, 213, 88, 0, 16, 22, 10, 8, 10, 4, 103, 213, 92, 0, 16, 22, 10, 8, 10, 4, 103, 213, 96, 0, 16, 22, 10, 8, 10, 4, 103, 213, 132, 0, 16, 22, 10, 8, 10, 4, 103, 213, 136, 0, 16, 22, 10, 8, 10, 4, 103, 213, 140, 0, 16, 22, 10, 8, 10, 4, 103, 213, 144, 0, 16, 22, 10, 8, 10, 4, 103, 213, 148, 0, 16, 22, 10, 8, 10, 4, 103, 213, 152, 0, 16, 22, 10, 8, 10, 4, 103, 213, 156, 0, 16, 22, 10, 8, 10, 4, 103, 213, 160, 0, 16, 22, 10, 8, 10, 4, 103, 213, 164, 0, 16, 22, 10, 8, 10, 4, 103, 213, 168, 0, 16, 22, 10, 8, 10, 4, 103, 213, 172, 0, 16, 22, 10, 8, 10, 4, 103, 213, 176, 0, 16, 22, 10, 8, 10, 4, 103, 213, 180, 0, 16, 22, 10, 8, 10, 4, 103, 213, 184, 0, 16, 22, 10, 8, 10, 4, 103, 213, 188, 0, 16, 22, 10, 8, 10, 4, 103, 213, 248, 0, 16, 22, 10, 8, 10, 4, 103, 213, 252, 0, 16, 22, 10, 8, 10, 4, 103, 214, 32, 0, 16, 22, 10, 8, 10, 4, 103, 214, 48, 0, 16, 22, 10, 8, 10, 4, 103, 214, 84, 0, 16, 22, 10, 8, 10, 4, 103, 214, 168, 0, 16, 22, 10, 8, 10, 4, 103, 214, 212, 0, 16, 22, 10, 8, 10, 4, 103, 214, 224, 0, 16, 22, 10, 8, 10, 4, 103, 214, 240, 0, 16, 22, 10, 8, 10, 4, 103, 214, 244, 0, 16, 22, 10, 8, 10, 4, 103, 215, 28, 0, 16, 22, 10, 8, 10, 4, 103, 215, 32, 0, 16, 22, 10, 8, 10, 4, 103, 215, 36, 0, 16, 22, 10, 8, 10, 4, 103, 215, 44, 0, 16, 22, 10, 8, 10, 4, 103, 215, 48, 0, 16, 22, 10, 8, 10, 4, 103, 215, 100, 0, 16, 22, 10, 8, 10, 4, 103, 215, 104, 0, 16, 22, 10, 8, 10, 4, 103, 215, 108, 0, 16, 22, 10, 8, 10, 4, 103, 215, 116, 0, 16, 22, 10, 8, 10, 4, 103, 215, 120, 0, 16, 22, 10, 8, 10, 4, 103, 215, 140, 0, 16, 22, 10, 8, 10, 4, 103, 215, 184, 0, 16, 22, 10, 8, 10, 4, 103, 215, 228, 0, 16, 22, 10, 8, 10, 4, 103, 216, 4, 0, 16, 22, 10, 8, 10, 4, 103, 216, 8, 0, 16, 22, 10, 8, 10, 4, 103, 216, 12, 0, 16, 22, 10, 8, 10, 4, 103, 216, 16, 0, 16, 22, 10, 8, 10, 4, 103, 216, 20, 0, 16, 22, 10, 8, 10, 4, 103, 216, 24, 0, 16, 22, 10, 8, 10, 4, 103, 216, 28, 0, 16, 22, 10, 8, 10, 4, 103, 216, 32, 0, 16, 22, 10, 8, 10, 4, 103, 216, 36, 0, 16, 22, 10, 8, 10, 4, 103, 216, 40, 0, 16, 22, 10, 8, 10, 4, 103, 216, 44, 0, 16, 22, 10, 8, 10, 4, 103, 216, 64, 0, 16, 22, 10, 8, 10, 4, 103, 216, 108, 0, 16, 22, 10, 8, 10, 4, 103, 216, 136, 0, 16, 22, 10, 8, 10, 4, 103, 216, 152, 0, 16, 22, 10, 8, 10, 4, 103, 216, 224, 0, 16, 22, 10, 8, 10, 4, 103, 216, 228, 0, 16, 22, 10, 8, 10, 4, 103, 216, 240, 0, 16, 22, 10, 8, 10, 4, 103, 216, 244, 0, 16, 22, 10, 8, 10, 4, 103, 216, 248, 0, 16, 22, 10, 8, 10, 4, 103, 216, 252, 0, 16, 22, 10, 8, 10, 4, 103, 217, 0, 0, 16, 22, 10, 8, 10, 4, 103, 217, 4, 0, 16, 22, 10, 8, 10, 4, 103, 217, 8, 0, 16, 22, 10, 8, 10, 4, 103, 217, 12, 0, 16, 22, 10, 8, 10, 4, 103, 217, 16, 0, 16, 22, 10, 8, 10, 4, 103, 217, 20, 0, 16, 22, 10, 8, 10, 4, 103, 217, 24, 0, 16, 22, 10, 8, 10, 4, 103, 217, 28, 0, 16, 22, 10, 8, 10, 4, 103, 217, 32, 0, 16, 22, 10, 8, 10, 4, 103, 217, 36, 0, 16, 22, 10, 8, 10, 4, 103, 217, 40, 0, 16, 22, 10, 8, 10, 4, 103, 217, 44, 0, 16, 22, 10, 8, 10, 4, 103, 217, 48, 0, 16, 22, 10, 8, 10, 4, 103, 217, 52, 0, 16, 22, 10, 8, 10, 4, 103, 217, 56, 0, 16, 22, 10, 8, 10, 4, 103, 217, 60, 0, 16, 22, 10, 8, 10, 4, 103, 217, 168, 0, 16, 22, 10, 8, 10, 4, 103, 217, 180, 0, 16, 22, 10, 8, 10, 4, 103, 217, 184, 0, 16, 22, 10, 8, 10, 4, 103, 217, 188, 0, 16, 22, 10, 8, 10, 4, 103, 217, 192, 0, 16, 22, 10, 8, 10, 4, 103, 217, 196, 0, 16, 22, 10, 8, 10, 4, 103, 217, 200, 0, 16, 22, 10, 8, 10, 4, 103, 217, 204, 0, 16, 22, 10, 8, 10, 4, 103, 218, 0, 0, 16, 22, 10, 8, 10, 4, 103, 218, 8, 0, 16, 22, 10, 8, 10, 4, 103, 218, 12, 0, 16, 22, 10, 8, 10, 4, 103, 218, 16, 0, 16, 22, 10, 8, 10, 4, 103, 218, 20, 0, 16, 22, 10, 8, 10, 4, 103, 218, 28, 0, 16, 22, 10, 8, 10, 4, 103, 218, 32, 0, 16, 22, 10, 8, 10, 4, 103, 218, 36, 0, 16, 22, 10, 8, 10, 4, 103, 218, 40, 0, 16, 22, 10, 8, 10, 4, 103, 218, 44, 0, 16, 22, 10, 8, 10, 4, 103, 218, 48, 0, 16, 22, 10, 8, 10, 4, 103, 218, 52, 0, 16, 22, 10, 8, 10, 4, 103, 218, 56, 0, 16, 22, 10, 8, 10, 4, 103, 218, 60, 0, 16, 22, 10, 8, 10, 4, 103, 218, 64, 0, 16, 22, 10, 8, 10, 4, 103, 218, 68, 0, 16, 22, 10, 8, 10, 4, 103, 218, 72, 0, 16, 22, 10, 8, 10, 4, 103, 218, 76, 0, 16, 22, 10, 8, 10, 4, 103, 218, 80, 0, 16, 22, 10, 8, 10, 4, 103, 218, 84, 0, 16, 22, 10, 8, 10, 4, 103, 218, 88, 0, 16, 22, 10, 8, 10, 4, 103, 218, 92, 0, 16, 22, 10, 8, 10, 4, 103, 218, 184, 0, 16, 22, 10, 8, 10, 4, 103, 218, 192, 0, 16, 22, 10, 8, 10, 4, 103, 218, 196, 0, 16, 22, 10, 8, 10, 4, 103, 218, 200, 0, 16, 22, 10, 8, 10, 4, 103, 218, 204, 0, 16, 22, 10, 8, 10, 4, 103, 218, 208, 0, 16, 22, 10, 8, 10, 4, 103, 218, 212, 0, 16, 22, 10, 8, 10, 4, 103, 218, 216, 0, 16, 22, 10, 8, 10, 4, 103, 219, 24, 0, 16, 22, 10, 8, 10, 4, 103, 219, 28, 0, 16, 22, 10, 8, 10, 4, 103, 219, 32, 0, 16, 22, 10, 8, 10, 4, 103, 219, 36, 0, 16, 22, 10, 8, 10, 4, 103, 219, 64, 0, 16, 22, 10, 8, 10, 4, 103, 219, 84, 0, 16, 22, 10, 8, 10, 4, 103, 219, 88, 0, 16, 22, 10, 8, 10, 4, 103, 219, 92, 0, 16, 22, 10, 8, 10, 4, 103, 219, 96, 0, 16, 22, 10, 8, 10, 4, 103, 219, 100, 0, 16, 22, 10, 8, 10, 4, 103, 219, 176, 0, 16, 22, 10, 8, 10, 4, 103, 219, 184, 0, 16, 22, 10, 8, 10, 4, 103, 220, 48, 0, 16, 22, 10, 8, 10, 4, 103, 220, 52, 0, 16, 22, 10, 8, 10, 4, 103, 220, 56, 0, 16, 22, 10, 8, 10, 4, 103, 220, 60, 0, 16, 22, 10, 8, 10, 4, 103, 220, 64, 0, 16, 22, 10, 8, 10, 4, 103, 220, 92, 0, 16, 22, 10, 8, 10, 4, 103, 220, 96, 0, 16, 22, 10, 8, 10, 4, 103, 220, 100, 0, 16, 22, 10, 8, 10, 4, 103, 220, 104, 0, 16, 22, 10, 8, 10, 4, 103, 220, 108, 0, 16, 22, 10, 8, 10, 4, 103, 220, 116, 0, 16, 22, 10, 8, 10, 4, 103, 220, 120, 0, 16, 22, 10, 8, 10, 4, 103, 220, 124, 0, 16, 22, 10, 8, 10, 4, 103, 220, 128, 0, 16, 22, 10, 8, 10, 4, 103, 220, 132, 0, 16, 22, 10, 8, 10, 4, 103, 220, 136, 0, 16, 22, 10, 8, 10, 4, 103, 220, 140, 0, 16, 22, 10, 8, 10, 4, 103, 220, 144, 0, 16, 22, 10, 8, 10, 4, 103, 220, 148, 0, 16, 22, 10, 8, 10, 4, 103, 220, 152, 0, 16, 22, 10, 8, 10, 4, 103, 220, 160, 0, 16, 22, 10, 8, 10, 4, 103, 220, 164, 0, 16, 22, 10, 8, 10, 4, 103, 220, 168, 0, 16, 22, 10, 8, 10, 4, 103, 220, 172, 0, 16, 22, 10, 8, 10, 4, 103, 220, 176, 0, 16, 22, 10, 8, 10, 4, 103, 220, 180, 0, 16, 22, 10, 8, 10, 4, 103, 220, 184, 0, 16, 22, 10, 8, 10, 4, 103, 220, 188, 0, 16, 22, 10, 8, 10, 4, 103, 220, 192, 0, 16, 22, 10, 8, 10, 4, 103, 220, 196, 0, 16, 22, 10, 8, 10, 4, 103, 220, 200, 0, 16, 22, 10, 8, 10, 4, 103, 220, 240, 0, 16, 22, 10, 8, 10, 4, 103, 220, 244, 0, 16, 22, 10, 8, 10, 4, 103, 220, 248, 0, 16, 22, 10, 8, 10, 4, 103, 220, 252, 0, 16, 22, 10, 8, 10, 4, 103, 221, 0, 0, 16, 22, 10, 8, 10, 4, 103, 221, 4, 0, 16, 22, 10, 8, 10, 4, 103, 221, 8, 0, 16, 22, 10, 8, 10, 4, 103, 221, 12, 0, 16, 22, 10, 8, 10, 4, 103, 221, 16, 0, 16, 22, 10, 8, 10, 4, 103, 221, 20, 0, 16, 22, 10, 8, 10, 4, 103, 221, 24, 0, 16, 22, 10, 8, 10, 4, 103, 221, 28, 0, 16, 22, 10, 8, 10, 4, 103, 221, 32, 0, 16, 22, 10, 8, 10, 4, 103, 221, 36, 0, 16, 22, 10, 8, 10, 4, 103, 221, 40, 0, 16, 22, 10, 8, 10, 4, 103, 221, 44, 0, 16, 22, 10, 8, 10, 4, 103, 221, 48, 0, 16, 22, 10, 8, 10, 4, 103, 221, 88, 0, 16, 22, 10, 8, 10, 4, 103, 221, 92, 0, 16, 22, 10, 8, 10, 4, 103, 221, 96, 0, 16, 22, 10, 8, 10, 4, 103, 221, 100, 0, 16, 22, 10, 8, 10, 4, 103, 221, 104, 0, 16, 22, 10, 8, 10, 4, 103, 221, 108, 0, 16, 22, 10, 8, 10, 4, 103, 221, 112, 0, 16, 22, 10, 8, 10, 4, 103, 221, 116, 0, 16, 22, 10, 8, 10, 4, 103, 221, 120, 0, 16, 22, 10, 8, 10, 4, 103, 221, 124, 0, 16, 22, 10, 8, 10, 4, 103, 221, 128, 0, 16, 22, 10, 8, 10, 4, 103, 221, 132, 0, 16, 22, 10, 8, 10, 4, 103, 221, 136, 0, 16, 22, 10, 8, 10, 4, 103, 221, 140, 0, 16, 22, 10, 8, 10, 4, 103, 221, 144, 0, 16, 22, 10, 8, 10, 4, 103, 221, 148, 0, 16, 22, 10, 8, 10, 4, 103, 221, 152, 0, 16, 22, 10, 8, 10, 4, 103, 221, 156, 0, 16, 22, 10, 8, 10, 4, 103, 221, 160, 0, 16, 22, 10, 8, 10, 4, 103, 221, 164, 0, 16, 22, 10, 8, 10, 4, 103, 221, 168, 0, 16, 22, 10, 8, 10, 4, 103, 221, 172, 0, 16, 22, 10, 8, 10, 4, 103, 221, 176, 0, 16, 22, 10, 8, 10, 4, 103, 221, 180, 0, 16, 22, 10, 8, 10, 4, 103, 221, 184, 0, 16, 22, 10, 8, 10, 4, 103, 221, 188, 0, 16, 22, 10, 8, 10, 4, 103, 221, 192, 0, 16, 22, 10, 8, 10, 4, 103, 221, 196, 0, 16, 22, 10, 8, 10, 4, 103, 221, 200, 0, 16, 22, 10, 8, 10, 4, 103, 221, 204, 0, 16, 22, 10, 8, 10, 4, 103, 222, 0, 0, 16, 22, 10, 8, 10, 4, 103, 222, 4, 0, 16, 22, 10, 8, 10, 4, 103, 222, 8, 0, 16, 22, 10, 8, 10, 4, 103, 222, 12, 0, 16, 22, 10, 8, 10, 4, 103, 222, 16, 0, 16, 22, 10, 8, 10, 4, 103, 222, 24, 0, 16, 22, 10, 8, 10, 4, 103, 222, 28, 0, 16, 22, 10, 8, 10, 4, 103, 222, 32, 0, 16, 22, 10, 8, 10, 4, 103, 222, 36, 0, 16, 22, 10, 8, 10, 4, 103, 222, 40, 0, 16, 22, 10, 8, 10, 4, 103, 222, 44, 0, 16, 22, 10, 8, 10, 4, 103, 222, 48, 0, 16, 22, 10, 8, 10, 4, 103, 222, 52, 0, 16, 22, 10, 8, 10, 4, 103, 222, 56, 0, 16, 22, 10, 8, 10, 4, 103, 222, 60, 0, 16, 22, 10, 8, 10, 4, 103, 222, 64, 0, 16, 22, 10, 8, 10, 4, 103, 222, 68, 0, 16, 22, 10, 8, 10, 4, 103, 222, 72, 0, 16, 22, 10, 8, 10, 4, 103, 222, 76, 0, 16, 22, 10, 8, 10, 4, 103, 222, 80, 0, 16, 22, 10, 8, 10, 4, 103, 222, 84, 0, 16, 22, 10, 8, 10, 4, 103, 222, 88, 0, 16, 22, 10, 8, 10, 4, 103, 222, 92, 0, 16, 22, 10, 8, 10, 4, 103, 222, 96, 0, 16, 22, 10, 8, 10, 4, 103, 222, 100, 0, 16, 22, 10, 8, 10, 4, 103, 222, 104, 0, 16, 22, 10, 8, 10, 4, 103, 222, 108, 0, 16, 22, 10, 8, 10, 4, 103, 222, 112, 0, 16, 22, 10, 8, 10, 4, 103, 222, 116, 0, 16, 22, 10, 8, 10, 4, 103, 222, 120, 0, 16, 22, 10, 8, 10, 4, 103, 222, 124, 0, 16, 22, 10, 8, 10, 4, 103, 222, 128, 0, 16, 22, 10, 8, 10, 4, 103, 222, 132, 0, 16, 22, 10, 8, 10, 4, 103, 222, 136, 0, 16, 22, 10, 8, 10, 4, 103, 222, 140, 0, 16, 22, 10, 8, 10, 4, 103, 222, 144, 0, 16, 22, 10, 8, 10, 4, 103, 222, 148, 0, 16, 22, 10, 8, 10, 4, 103, 222, 152, 0, 16, 22, 10, 8, 10, 4, 103, 222, 156, 0, 16, 22, 10, 8, 10, 4, 103, 222, 160, 0, 16, 22, 10, 8, 10, 4, 103, 222, 164, 0, 16, 22, 10, 8, 10, 4, 103, 222, 168, 0, 16, 22, 10, 8, 10, 4, 103, 222, 172, 0, 16, 22, 10, 8, 10, 4, 103, 222, 176, 0, 16, 22, 10, 8, 10, 4, 103, 222, 180, 0, 16, 22, 10, 8, 10, 4, 103, 222, 184, 0, 16, 22, 10, 8, 10, 4, 103, 222, 188, 0, 16, 22, 10, 8, 10, 4, 103, 222, 192, 0, 16, 22, 10, 8, 10, 4, 103, 222, 196, 0, 16, 22, 10, 8, 10, 4, 103, 222, 200, 0, 16, 22, 10, 8, 10, 4, 103, 222, 204, 0, 16, 22, 10, 8, 10, 4, 103, 222, 208, 0, 16, 22, 10, 8, 10, 4, 103, 222, 212, 0, 16, 22, 10, 8, 10, 4, 103, 222, 216, 0, 16, 22, 10, 8, 10, 4, 103, 222, 220, 0, 16, 22, 10, 8, 10, 4, 103, 222, 224, 0, 16, 22, 10, 8, 10, 4, 103, 222, 228, 0, 16, 22, 10, 8, 10, 4, 103, 222, 232, 0, 16, 22, 10, 8, 10, 4, 103, 222, 240, 0, 16, 22, 10, 8, 10, 4, 103, 222, 244, 0, 16, 22, 10, 8, 10, 4, 103, 223, 16, 0, 16, 22, 10, 8, 10, 4, 103, 223, 20, 0, 16, 22, 10, 8, 10, 4, 103, 223, 24, 0, 16, 22, 10, 8, 10, 4, 103, 223, 28, 0, 16, 22, 10, 8, 10, 4, 103, 223, 32, 0, 16, 22, 10, 8, 10, 4, 103, 223, 36, 0, 16, 22, 10, 8, 10, 4, 103, 223, 40, 0, 16, 22, 10, 8, 10, 4, 103, 223, 44, 0, 16, 22, 10, 8, 10, 4, 103, 223, 48, 0, 16, 22, 10, 8, 10, 4, 103, 223, 52, 0, 16, 22, 10, 8, 10, 4, 103, 223, 56, 0, 16, 22, 10, 8, 10, 4, 103, 223, 60, 0, 16, 22, 10, 8, 10, 4, 103, 223, 64, 0, 16, 22, 10, 8, 10, 4, 103, 223, 68, 0, 16, 22, 10, 8, 10, 4, 103, 223, 72, 0, 16, 22, 10, 8, 10, 4, 103, 223, 76, 0, 16, 22, 10, 8, 10, 4, 103, 223, 80, 0, 16, 22, 10, 8, 10, 4, 103, 223, 84, 0, 16, 22, 10, 8, 10, 4, 103, 223, 88, 0, 16, 22, 10, 8, 10, 4, 103, 223, 92, 0, 16, 22, 10, 8, 10, 4, 103, 223, 96, 0, 16, 22, 10, 8, 10, 4, 103, 223, 100, 0, 16, 22, 10, 8, 10, 4, 103, 223, 104, 0, 16, 22, 10, 8, 10, 4, 103, 223, 108, 0, 16, 22, 10, 8, 10, 4, 103, 223, 112, 0, 16, 22, 10, 8, 10, 4, 103, 223, 116, 0, 16, 22, 10, 8, 10, 4, 103, 223, 120, 0, 16, 22, 10, 8, 10, 4, 103, 223, 124, 0, 16, 22, 10, 8, 10, 4, 103, 223, 128, 0, 16, 22, 10, 8, 10, 4, 103, 223, 132, 0, 16, 22, 10, 8, 10, 4, 103, 223, 140, 0, 16, 22, 10, 8, 10, 4, 103, 223, 144, 0, 16, 22, 10, 8, 10, 4, 103, 223, 148, 0, 16, 22, 10, 8, 10, 4, 103, 223, 152, 0, 16, 22, 10, 8, 10, 4, 103, 223, 156, 0, 16, 22, 10, 8, 10, 4, 103, 223, 160, 0, 16, 22, 10, 8, 10, 4, 103, 223, 164, 0, 16, 22, 10, 8, 10, 4, 103, 223, 168, 0, 16, 22, 10, 8, 10, 4, 103, 223, 172, 0, 16, 22, 10, 8, 10, 4, 103, 223, 176, 0, 16, 22, 10, 8, 10, 4, 103, 223, 180, 0, 16, 22, 10, 8, 10, 4, 103, 223, 188, 0, 16, 22, 10, 8, 10, 4, 103, 223, 192, 0, 16, 22, 10, 8, 10, 4, 103, 223, 196, 0, 16, 22, 10, 8, 10, 4, 103, 223, 200, 0, 16, 22, 10, 8, 10, 4, 103, 223, 204, 0, 16, 22, 10, 8, 10, 4, 103, 223, 208, 0, 16, 22, 10, 8, 10, 4, 103, 223, 212, 0, 16, 22, 10, 8, 10, 4, 103, 223, 216, 0, 16, 22, 10, 8, 10, 4, 103, 223, 220, 0, 16, 22, 10, 8, 10, 4, 103, 223, 224, 0, 16, 22, 10, 8, 10, 4, 103, 223, 228, 0, 16, 22, 10, 8, 10, 4, 103, 223, 232, 0, 16, 22, 10, 8, 10, 4, 103, 223, 236, 0, 16, 22, 10, 8, 10, 4, 103, 223, 240, 0, 16, 22, 10, 8, 10, 4, 103, 223, 244, 0, 16, 22, 10, 8, 10, 4, 103, 223, 248, 0, 16, 22, 10, 8, 10, 4, 103, 223, 252, 0, 16, 22, 10, 8, 10, 4, 103, 224, 0, 0, 16, 22, 10, 8, 10, 4, 103, 224, 16, 0, 16, 22, 10, 8, 10, 4, 103, 224, 40, 0, 16, 22, 10, 8, 10, 4, 103, 224, 44, 0, 16, 22, 10, 8, 10, 4, 103, 224, 60, 0, 16, 22, 10, 8, 10, 4, 103, 224, 80, 0, 16, 22, 10, 8, 10, 4, 103, 224, 220, 0, 16, 22, 10, 8, 10, 4, 103, 224, 224, 0, 16, 22, 10, 8, 10, 4, 103, 224, 228, 0, 16, 22, 10, 8, 10, 4, 103, 224, 232, 0, 16, 22, 10, 8, 10, 4, 103, 225, 84, 0, 16, 22, 10, 8, 10, 4, 103, 226, 16, 0, 16, 22, 10, 8, 10, 4, 103, 226, 40, 0, 16, 22, 10, 8, 10, 4, 103, 226, 56, 0, 16, 22, 10, 8, 10, 4, 103, 226, 60, 0, 16, 22, 10, 8, 10, 4, 103, 226, 80, 0, 16, 22, 10, 8, 10, 4, 103, 226, 116, 0, 16, 22, 10, 8, 10, 4, 103, 226, 132, 0, 16, 22, 10, 8, 10, 4, 103, 226, 156, 0, 16, 22, 10, 8, 10, 4, 103, 226, 180, 0, 16, 22, 10, 8, 10, 4, 103, 226, 196, 0, 16, 22, 10, 8, 10, 4, 103, 227, 48, 0, 16, 22, 10, 8, 10, 4, 103, 227, 72, 0, 16, 22, 10, 8, 10, 4, 103, 227, 76, 0, 16, 22, 10, 8, 10, 4, 103, 227, 80, 0, 16, 22, 10, 8, 10, 4, 103, 227, 100, 0, 16, 22, 10, 8, 10, 4, 103, 227, 120, 0, 16, 22, 10, 8, 10, 4, 103, 227, 132, 0, 16, 22, 10, 8, 10, 4, 103, 227, 136, 0, 16, 22, 10, 8, 10, 4, 103, 227, 196, 0, 16, 22, 10, 8, 10, 4, 103, 227, 204, 0, 16, 22, 10, 8, 10, 4, 103, 227, 212, 0, 16, 22, 10, 8, 10, 4, 103, 227, 228, 0, 16, 22, 10, 8, 10, 4, 103, 228, 12, 0, 16, 22, 10, 8, 10, 4, 103, 228, 28, 0, 16, 22, 10, 8, 10, 4, 103, 228, 68, 0, 16, 22, 10, 8, 10, 4, 103, 228, 88, 0, 16, 22, 10, 8, 10, 4, 103, 228, 128, 0, 16, 22, 10, 8, 10, 4, 103, 228, 136, 0, 16, 22, 10, 8, 10, 4, 103, 228, 160, 0, 16, 22, 10, 8, 10, 4, 103, 228, 176, 0, 16, 22, 10, 8, 10, 4, 103, 228, 204, 0, 16, 22, 10, 8, 10, 4, 103, 228, 208, 0, 16, 22, 10, 8, 10, 4, 103, 228, 228, 0, 16, 22, 10, 8, 10, 4, 103, 228, 232, 0, 16, 22, 10, 8, 10, 4, 103, 229, 20, 0, 16, 22, 10, 8, 10, 4, 103, 229, 60, 0, 16, 22, 10, 8, 10, 4, 103, 229, 136, 0, 16, 22, 10, 8, 10, 4, 103, 229, 148, 0, 16, 22, 10, 8, 10, 4, 103, 229, 172, 0, 16, 22, 10, 8, 10, 4, 103, 229, 212, 0, 16, 22, 10, 8, 10, 4, 103, 229, 216, 0, 16, 22, 10, 8, 10, 4, 103, 229, 220, 0, 16, 22, 10, 8, 10, 4, 103, 229, 228, 0, 16, 22, 10, 8, 10, 4, 103, 229, 236, 0, 16, 22, 10, 8, 10, 4, 103, 229, 240, 0, 16, 22, 10, 8, 10, 4, 103, 230, 0, 0, 16, 22, 10, 8, 10, 4, 103, 230, 28, 0, 16, 22, 10, 8, 10, 4, 103, 230, 40, 0, 16, 22, 10, 8, 10, 4, 103, 230, 44, 0, 16, 22, 10, 8, 10, 4, 103, 230, 96, 0, 16, 22, 10, 8, 10, 4, 103, 230, 196, 0, 16, 22, 10, 8, 10, 4, 103, 230, 200, 0, 16, 22, 10, 8, 10, 4, 103, 230, 204, 0, 16, 22, 10, 8, 10, 4, 103, 230, 212, 0, 16, 22, 10, 8, 10, 4, 103, 230, 236, 0, 16, 22, 10, 8, 10, 4, 103, 231, 16, 0, 16, 22, 10, 8, 10, 4, 103, 231, 20, 0, 16, 22, 10, 8, 10, 4, 103, 231, 64, 0, 16, 22, 10, 8, 10, 4, 103, 231, 68, 0, 16, 22, 10, 8, 10, 4, 103, 231, 144, 0, 16, 22, 10, 8, 10, 4, 103, 231, 180, 0, 16, 22, 10, 8, 10, 4, 103, 231, 184, 0, 16, 22, 10, 8, 10, 4, 103, 231, 244, 0, 16, 22, 10, 8, 10, 4, 103, 232, 4, 0, 16, 22, 10, 8, 10, 4, 103, 232, 144, 0, 16, 22, 10, 8, 10, 4, 103, 232, 188, 0, 16, 22, 10, 8, 10, 4, 103, 232, 212, 0, 16, 22, 10, 8, 10, 4, 103, 233, 4, 0, 16, 22, 10, 8, 10, 4, 103, 233, 44, 0, 16, 22, 10, 8, 10, 4, 103, 233, 52, 0, 16, 22, 10, 8, 10, 4, 103, 233, 104, 0, 16, 22, 10, 8, 10, 4, 103, 233, 128, 0, 16, 22, 10, 8, 10, 4, 103, 233, 136, 0, 16, 22, 10, 8, 10, 4, 103, 233, 228, 0, 16, 22, 10, 8, 10, 4, 103, 234, 0, 0, 16, 22, 10, 8, 10, 4, 103, 234, 20, 0, 16, 22, 10, 8, 10, 4, 103, 234, 56, 0, 16, 22, 10, 8, 10, 4, 103, 234, 124, 0, 16, 22, 10, 8, 10, 4, 103, 234, 128, 0, 16, 22, 10, 8, 10, 4, 103, 234, 172, 0, 16, 22, 10, 8, 10, 4, 103, 234, 180, 0, 16, 22, 10, 8, 10, 4, 103, 234, 244, 0, 16, 22, 10, 8, 10, 4, 103, 235, 16, 0, 16, 22, 10, 8, 10, 4, 103, 235, 48, 0, 16, 22, 10, 8, 10, 4, 103, 235, 56, 0, 16, 22, 10, 8, 10, 4, 103, 235, 60, 0, 16, 22, 10, 8, 10, 4, 103, 235, 80, 0, 16, 22, 10, 8, 10, 4, 103, 235, 84, 0, 16, 22, 10, 8, 10, 4, 103, 235, 128, 0, 16, 22, 10, 8, 10, 4, 103, 235, 132, 0, 16, 22, 10, 8, 10, 4, 103, 235, 136, 0, 16, 22, 10, 8, 10, 4, 103, 235, 140, 0, 16, 22, 10, 8, 10, 4, 103, 235, 144, 0, 16, 22, 10, 8, 10, 4, 103, 235, 148, 0, 16, 22, 10, 8, 10, 4, 103, 235, 184, 0, 16, 22, 10, 8, 10, 4, 103, 235, 192, 0, 16, 22, 10, 8, 10, 4, 103, 235, 200, 0, 16, 22, 10, 8, 10, 4, 103, 235, 220, 0, 16, 22, 10, 8, 10, 4, 103, 235, 224, 0, 16, 22, 10, 8, 10, 4, 103, 235, 228, 0, 16, 22, 10, 8, 10, 4, 103, 235, 232, 0, 16, 22, 10, 8, 10, 4, 103, 235, 236, 0, 16, 22, 10, 8, 10, 4, 103, 235, 240, 0, 16, 22, 10, 8, 10, 4, 103, 235, 244, 0, 16, 22, 10, 8, 10, 4, 103, 235, 248, 0, 16, 22, 10, 8, 10, 4, 103, 235, 252, 0, 16, 22, 10, 8, 10, 4, 103, 236, 0, 0, 16, 22, 10, 8, 10, 4, 103, 236, 4, 0, 16, 22, 10, 8, 10, 4, 103, 236, 8, 0, 16, 22, 10, 8, 10, 4, 103, 236, 12, 0, 16, 22, 10, 8, 10, 4, 103, 236, 16, 0, 16, 22, 10, 8, 10, 4, 103, 236, 20, 0, 16, 22, 10, 8, 10, 4, 103, 236, 24, 0, 16, 22, 10, 8, 10, 4, 103, 236, 28, 0, 16, 22, 10, 8, 10, 4, 103, 236, 32, 0, 16, 22, 10, 8, 10, 4, 103, 236, 36, 0, 16, 22, 10, 8, 10, 4, 103, 236, 40, 0, 16, 22, 10, 8, 10, 4, 103, 236, 44, 0, 16, 22, 10, 8, 10, 4, 103, 236, 48, 0, 16, 22, 10, 8, 10, 4, 103, 236, 52, 0, 16, 22, 10, 8, 10, 4, 103, 236, 56, 0, 16, 22, 10, 8, 10, 4, 103, 236, 60, 0, 16, 22, 10, 8, 10, 4, 103, 236, 64, 0, 16, 22, 10, 8, 10, 4, 103, 236, 68, 0, 16, 22, 10, 8, 10, 4, 103, 236, 72, 0, 16, 22, 10, 8, 10, 4, 103, 236, 76, 0, 16, 22, 10, 8, 10, 4, 103, 236, 80, 0, 16, 22, 10, 8, 10, 4, 103, 236, 84, 0, 16, 22, 10, 8, 10, 4, 103, 236, 88, 0, 16, 22, 10, 8, 10, 4, 103, 236, 92, 0, 16, 22, 10, 8, 10, 4, 103, 236, 96, 0, 16, 22, 10, 8, 10, 4, 103, 236, 120, 0, 16, 22, 10, 8, 10, 4, 103, 236, 184, 0, 16, 22, 10, 8, 10, 4, 103, 236, 220, 0, 16, 22, 10, 8, 10, 4, 103, 236, 232, 0, 16, 22, 10, 8, 10, 4, 103, 236, 240, 0, 16, 22, 10, 8, 10, 4, 103, 236, 244, 0, 16, 22, 10, 8, 10, 4, 103, 236, 248, 0, 16, 22, 10, 8, 10, 4, 103, 236, 252, 0, 16, 22, 10, 8, 10, 4, 103, 237, 0, 0, 16, 22, 10, 8, 10, 4, 103, 237, 4, 0, 16, 22, 10, 8, 10, 4, 103, 237, 8, 0, 16, 22, 10, 8, 10, 4, 103, 237, 12, 0, 16, 22, 10, 8, 10, 4, 103, 237, 24, 0, 16, 22, 10, 8, 10, 4, 103, 237, 28, 0, 16, 22, 10, 8, 10, 4, 103, 237, 68, 0, 16, 22, 10, 8, 10, 4, 103, 237, 88, 0, 16, 22, 10, 8, 10, 4, 103, 237, 152, 0, 16, 22, 10, 8, 10, 4, 103, 237, 176, 0, 16, 22, 10, 8, 10, 4, 103, 237, 180, 0, 16, 22, 10, 8, 10, 4, 103, 237, 184, 0, 16, 22, 10, 8, 10, 4, 103, 237, 188, 0, 16, 22, 10, 8, 10, 4, 103, 237, 192, 0, 16, 22, 10, 8, 10, 4, 103, 237, 196, 0, 16, 22, 10, 8, 10, 4, 103, 237, 200, 0, 16, 22, 10, 8, 10, 4, 103, 237, 204, 0, 16, 22, 10, 8, 10, 4, 103, 237, 208, 0, 16, 22, 10, 8, 10, 4, 103, 237, 212, 0, 16, 22, 10, 8, 10, 4, 103, 237, 216, 0, 16, 22, 10, 8, 10, 4, 103, 237, 220, 0, 16, 22, 10, 8, 10, 4, 103, 237, 224, 0, 16, 22, 10, 8, 10, 4, 103, 237, 228, 0, 16, 22, 10, 8, 10, 4, 103, 237, 232, 0, 16, 22, 10, 8, 10, 4, 103, 237, 236, 0, 16, 22, 10, 8, 10, 4, 103, 237, 240, 0, 16, 22, 10, 8, 10, 4, 103, 237, 244, 0, 16, 22, 10, 8, 10, 4, 103, 237, 248, 0, 16, 22, 10, 8, 10, 4, 103, 237, 252, 0, 16, 22, 10, 8, 10, 4, 103, 238, 0, 0, 16, 22, 10, 8, 10, 4, 103, 238, 4, 0, 16, 22, 10, 8, 10, 4, 103, 238, 16, 0, 16, 22, 10, 8, 10, 4, 103, 238, 20, 0, 16, 22, 10, 8, 10, 4, 103, 238, 24, 0, 16, 22, 10, 8, 10, 4, 103, 238, 28, 0, 16, 22, 10, 8, 10, 4, 103, 238, 32, 0, 16, 22, 10, 8, 10, 4, 103, 238, 36, 0, 16, 22, 10, 8, 10, 4, 103, 238, 40, 0, 16, 22, 10, 8, 10, 4, 103, 238, 44, 0, 16, 22, 10, 8, 10, 4, 103, 238, 48, 0, 16, 22, 10, 8, 10, 4, 103, 238, 52, 0, 16, 22, 10, 8, 10, 4, 103, 238, 56, 0, 16, 22, 10, 8, 10, 4, 103, 238, 88, 0, 16, 22, 10, 8, 10, 4, 103, 238, 92, 0, 16, 22, 10, 8, 10, 4, 103, 238, 96, 0, 16, 22, 10, 8, 10, 4, 103, 238, 132, 0, 16, 22, 10, 8, 10, 4, 103, 238, 140, 0, 16, 22, 10, 8, 10, 4, 103, 238, 144, 0, 16, 22, 10, 8, 10, 4, 103, 238, 160, 0, 16, 22, 10, 8, 10, 4, 103, 238, 164, 0, 16, 22, 10, 8, 10, 4, 103, 238, 168, 0, 16, 22, 10, 8, 10, 4, 103, 238, 172, 0, 16, 22, 10, 8, 10, 4, 103, 238, 176, 0, 16, 22, 10, 8, 10, 4, 103, 238, 180, 0, 16, 22, 10, 8, 10, 4, 103, 238, 184, 0, 16, 22, 10, 8, 10, 4, 103, 238, 188, 0, 16, 22, 10, 8, 10, 4, 103, 238, 196, 0, 16, 22, 10, 8, 10, 4, 103, 238, 204, 0, 16, 22, 10, 8, 10, 4, 103, 238, 252, 0, 16, 22, 10, 8, 10, 4, 103, 239, 0, 0, 16, 22, 10, 8, 10, 4, 103, 239, 44, 0, 16, 22, 10, 8, 10, 4, 103, 239, 68, 0, 16, 22, 10, 8, 10, 4, 103, 239, 96, 0, 16, 22, 10, 8, 10, 4, 103, 239, 152, 0, 16, 22, 10, 8, 10, 4, 103, 239, 156, 0, 16, 22, 10, 8, 10, 4, 103, 239, 176, 0, 16, 22, 10, 8, 10, 4, 103, 239, 180, 0, 16, 22, 10, 8, 10, 4, 103, 239, 184, 0, 16, 22, 10, 8, 10, 4, 103, 239, 192, 0, 16, 22, 10, 8, 10, 4, 103, 239, 196, 0, 16, 22, 10, 8, 10, 4, 103, 239, 204, 0, 16, 22, 10, 8, 10, 4, 103, 239, 208, 0, 16, 22, 10, 8, 10, 4, 103, 239, 224, 0, 16, 22, 10, 8, 10, 4, 103, 239, 244, 0, 16, 22, 10, 8, 10, 4, 103, 240, 16, 0, 16, 22, 10, 8, 10, 4, 103, 240, 36, 0, 16, 22, 10, 8, 10, 4, 103, 240, 72, 0, 16, 22, 10, 8, 10, 4, 103, 240, 84, 0, 16, 22, 10, 8, 10, 4, 103, 240, 124, 0, 16, 22, 10, 8, 10, 4, 103, 240, 156, 0, 16, 22, 10, 8, 10, 4, 103, 240, 172, 0, 16, 22, 10, 8, 10, 4, 103, 240, 188, 0, 16, 22, 10, 8, 10, 4, 103, 240, 244, 0, 16, 22, 10, 8, 10, 4, 103, 241, 12, 0, 16, 22, 10, 8, 10, 4, 103, 241, 72, 0, 16, 22, 10, 8, 10, 4, 103, 241, 92, 0, 16, 22, 10, 8, 10, 4, 103, 241, 96, 0, 16, 22, 10, 8, 10, 4, 103, 241, 160, 0, 16, 22, 10, 8, 10, 4, 103, 241, 184, 0, 16, 22, 10, 8, 10, 4, 103, 241, 188, 0, 16, 22, 10, 8, 10, 4, 103, 241, 220, 0, 16, 22, 10, 8, 10, 4, 103, 242, 8, 0, 16, 22, 10, 8, 10, 4, 103, 242, 64, 0, 16, 22, 10, 8, 10, 4, 103, 242, 128, 0, 16, 22, 10, 8, 10, 4, 103, 242, 132, 0, 16, 22, 10, 8, 10, 4, 103, 242, 160, 0, 16, 22, 10, 8, 10, 4, 103, 242, 168, 0, 16, 22, 10, 8, 10, 4, 103, 242, 172, 0, 16, 22, 10, 8, 10, 4, 103, 242, 176, 0, 16, 22, 10, 8, 10, 4, 103, 242, 200, 0, 16, 22, 10, 8, 10, 4, 103, 242, 212, 0, 16, 22, 10, 8, 10, 4, 103, 242, 220, 0, 16, 22, 10, 8, 10, 4, 103, 242, 240, 0, 16, 22, 10, 8, 10, 4, 103, 243, 136, 0, 16, 22, 10, 8, 10, 4, 103, 243, 252, 0, 16, 22, 10, 8, 10, 4, 103, 244, 16, 0, 16, 22, 10, 8, 10, 4, 103, 244, 58, 0, 16, 23, 10, 8, 10, 4, 103, 244, 60, 0, 16, 22, 10, 8, 10, 4, 103, 244, 64, 0, 16, 22, 10, 8, 10, 4, 103, 244, 68, 0, 16, 22, 10, 8, 10, 4, 103, 244, 72, 0, 16, 22, 10, 8, 10, 4, 103, 244, 76, 0, 16, 22, 10, 8, 10, 4, 103, 244, 80, 0, 16, 22, 10, 8, 10, 4, 103, 244, 84, 0, 16, 22, 10, 8, 10, 4, 103, 244, 116, 0, 16, 22, 10, 8, 10, 4, 103, 244, 164, 0, 16, 22, 10, 8, 10, 4, 103, 244, 232, 0, 16, 22, 10, 8, 10, 4, 103, 244, 252, 0, 16, 22, 10, 8, 10, 4, 103, 245, 23, 0, 16, 24, 10, 8, 10, 4, 103, 245, 52, 0, 16, 22, 10, 8, 10, 4, 103, 245, 60, 0, 16, 22, 10, 8, 10, 4, 103, 245, 80, 0, 16, 22, 10, 8, 10, 4, 103, 245, 124, 0, 16, 22, 10, 8, 10, 4, 103, 245, 128, 0, 16, 22, 10, 8, 10, 4, 103, 246, 8, 0, 16, 22, 10, 8, 10, 4, 103, 246, 12, 0, 16, 22, 10, 8, 10, 4, 103, 246, 120, 0, 16, 22, 10, 8, 10, 4, 103, 246, 124, 0, 16, 22, 10, 8, 10, 4, 103, 246, 132, 0, 16, 22, 10, 8, 10, 4, 103, 246, 152, 0, 16, 22, 10, 8, 10, 4, 103, 246, 156, 0, 16, 22, 10, 8, 10, 4, 103, 247, 168, 0, 16, 22, 10, 8, 10, 4, 103, 247, 172, 0, 16, 22, 10, 8, 10, 4, 103, 247, 176, 0, 16, 22, 10, 8, 10, 4, 103, 247, 200, 0, 16, 22, 10, 8, 10, 4, 103, 247, 212, 0, 16, 22, 10, 8, 10, 4, 103, 248, 0, 0, 16, 23, 10, 8, 10, 4, 103, 248, 64, 0, 16, 22, 10, 8, 10, 4, 103, 248, 100, 0, 16, 22, 10, 8, 10, 4, 103, 248, 124, 0, 16, 22, 10, 8, 10, 4, 103, 248, 152, 0, 16, 22, 10, 8, 10, 4, 103, 248, 168, 0, 16, 22, 10, 8, 10, 4, 103, 248, 192, 0, 16, 22, 10, 8, 10, 4, 103, 248, 212, 0, 16, 22, 10, 8, 10, 4, 103, 248, 220, 0, 16, 22, 10, 8, 10, 4, 103, 248, 224, 0, 16, 22, 10, 8, 10, 4, 103, 248, 228, 0, 16, 22, 10, 8, 10, 4, 103, 249, 8, 0, 16, 22, 10, 8, 10, 4, 103, 249, 12, 0, 16, 22, 10, 8, 10, 4, 103, 249, 52, 0, 16, 22, 10, 8, 10, 4, 103, 249, 104, 0, 16, 22, 10, 8, 10, 4, 103, 249, 128, 0, 16, 22, 10, 8, 10, 4, 103, 249, 136, 0, 16, 22, 10, 8, 10, 4, 103, 249, 144, 0, 16, 22, 10, 8, 10, 4, 103, 249, 164, 0, 16, 22, 10, 8, 10, 4, 103, 249, 168, 0, 16, 22, 10, 8, 10, 4, 103, 249, 172, 0, 16, 22, 10, 8, 10, 4, 103, 249, 176, 0, 16, 22, 10, 8, 10, 4, 103, 249, 188, 0, 16, 22, 10, 8, 10, 4, 103, 249, 192, 0, 16, 22, 10, 8, 10, 4, 103, 249, 244, 0, 16, 22, 10, 8, 10, 4, 103, 249, 252, 0, 16, 22, 10, 8, 10, 4, 103, 250, 32, 0, 16, 22, 10, 8, 10, 4, 103, 250, 104, 0, 16, 22, 10, 8, 10, 4, 103, 250, 124, 0, 16, 22, 10, 8, 10, 4, 103, 250, 180, 0, 16, 22, 10, 8, 10, 4, 103, 250, 192, 0, 16, 22, 10, 8, 10, 4, 103, 250, 216, 0, 16, 22, 10, 8, 10, 4, 103, 250, 224, 0, 16, 22, 10, 8, 10, 4, 103, 250, 236, 0, 16, 22, 10, 8, 10, 4, 103, 250, 248, 0, 16, 22, 10, 8, 10, 4, 103, 250, 252, 0, 16, 22, 10, 8, 10, 4, 103, 251, 32, 0, 16, 22, 10, 8, 10, 4, 103, 251, 36, 0, 16, 22, 10, 8, 10, 4, 103, 251, 84, 0, 16, 22, 10, 8, 10, 4, 103, 251, 96, 0, 16, 22, 10, 8, 10, 4, 103, 251, 124, 0, 16, 22, 10, 8, 10, 4, 103, 251, 128, 0, 16, 22, 10, 8, 10, 4, 103, 251, 160, 0, 16, 22, 10, 8, 10, 4, 103, 251, 192, 0, 16, 22, 10, 8, 10, 4, 103, 251, 204, 0, 16, 22, 10, 8, 10, 4, 103, 251, 236, 0, 16, 22, 10, 8, 10, 4, 103, 251, 240, 0, 16, 22, 10, 8, 10, 4, 103, 252, 28, 0, 16, 22, 10, 8, 10, 4, 103, 252, 36, 0, 16, 22, 10, 8, 10, 4, 103, 252, 64, 0, 16, 22, 10, 8, 10, 4, 103, 252, 96, 0, 16, 22, 10, 8, 10, 4, 103, 252, 104, 0, 16, 22, 10, 8, 10, 4, 103, 252, 172, 0, 16, 22, 10, 8, 10, 4, 103, 252, 204, 0, 16, 22, 10, 8, 10, 4, 103, 252, 208, 0, 16, 22, 10, 8, 10, 4, 103, 252, 232, 0, 16, 22, 10, 8, 10, 4, 103, 252, 248, 0, 16, 22, 10, 8, 10, 4, 103, 253, 4, 0, 16, 22, 10, 8, 10, 4, 103, 253, 60, 0, 16, 22, 10, 8, 10, 4, 103, 253, 204, 0, 16, 22, 10, 8, 10, 4, 103, 253, 220, 0, 16, 22, 10, 8, 10, 4, 103, 253, 224, 0, 16, 22, 10, 8, 10, 4, 103, 253, 232, 0, 16, 22, 10, 8, 10, 4, 103, 254, 8, 0, 16, 22, 10, 8, 10, 4, 103, 254, 20, 0, 16, 22, 10, 8, 10, 4, 103, 254, 64, 0, 16, 22, 10, 8, 10, 4, 103, 254, 68, 0, 16, 22, 10, 8, 10, 4, 103, 254, 72, 0, 16, 22, 10, 8, 10, 4, 103, 254, 76, 0, 16, 22, 10, 8, 10, 4, 103, 254, 112, 0, 16, 22, 10, 8, 10, 4, 103, 254, 176, 0, 16, 22, 10, 8, 10, 4, 103, 254, 188, 0, 16, 22, 10, 8, 10, 4, 103, 254, 196, 0, 16, 24, 10, 8, 10, 4, 103, 254, 220, 0, 16, 22, 10, 8, 10, 4, 103, 255, 56, 0, 16, 22, 10, 8, 10, 4, 103, 255, 68, 0, 16, 22, 10, 8, 10, 4, 103, 255, 88, 0, 16, 22, 10, 8, 10, 4, 103, 255, 92, 0, 16, 22, 10, 8, 10, 4, 103, 255, 136, 0, 16, 22, 10, 8, 10, 4, 103, 255, 140, 0, 16, 22, 10, 8, 10, 4, 103, 255, 184, 0, 16, 22, 10, 8, 10, 4, 103, 255, 200, 0, 16, 22, 10, 8, 10, 4, 103, 255, 212, 0, 16, 22, 10, 8, 10, 4, 103, 255, 228, 0, 16, 22, 10, 8, 10, 4, 106, 0, 0, 0, 16, 24, 10, 8, 10, 4, 106, 0, 2, 0, 16, 23, 10, 8, 10, 4, 106, 0, 4, 0, 16, 22, 10, 8, 10, 4, 106, 0, 8, 0, 16, 21, 10, 8, 10, 4, 106, 0, 16, 0, 16, 20, 10, 8, 10, 4, 106, 0, 44, 0, 16, 22, 10, 8, 10, 4, 106, 0, 64, 0, 16, 18, 10, 8, 10, 4, 106, 2, 0, 0, 16, 15, 10, 8, 10, 4, 106, 4, 0, 0, 16, 14, 10, 8, 10, 4, 106, 8, 0, 0, 16, 15, 10, 8, 10, 4, 106, 11, 0, 0, 16, 16, 10, 8, 10, 4, 106, 12, 0, 0, 16, 14, 10, 8, 10, 4, 106, 16, 0, 0, 16, 12, 10, 8, 10, 4, 106, 32, 0, 0, 16, 12, 10, 8, 10, 4, 106, 48, 0, 0, 16, 15, 10, 8, 10, 4, 106, 50, 0, 0, 16, 16, 10, 8, 10, 4, 106, 52, 0, 0, 16, 14, 10, 8, 10, 4, 106, 56, 0, 0, 16, 13, 10, 8, 10, 4, 106, 74, 0, 0, 16, 16, 10, 8, 10, 4, 106, 75, 0, 0, 16, 16, 10, 8, 10, 4, 106, 80, 0, 0, 16, 12, 10, 8, 10, 4, 106, 108, 0, 0, 16, 14, 10, 8, 10, 4, 106, 112, 0, 0, 16, 13, 10, 8, 10, 4, 106, 120, 0, 0, 16, 13, 10, 8, 10, 4, 106, 224, 0, 0, 16, 12, 10, 8, 10, 4, 109, 244, 0, 0, 16, 16, 10, 8, 10, 4, 110, 6, 0, 0, 16, 15, 10, 8, 10, 4, 110, 16, 0, 0, 16, 14, 10, 8, 10, 4, 110, 34, 40, 0, 16, 22, 10, 8, 10, 4, 110, 34, 44, 0, 16, 22, 10, 8, 10, 4, 110, 40, 0, 0, 16, 14, 10, 8, 10, 4, 110, 44, 12, 0, 16, 22, 10, 8, 10, 4, 110, 44, 144, 0, 16, 20, 10, 8, 10, 4, 110, 48, 0, 0, 16, 16, 10, 8, 10, 4, 110, 51, 0, 0, 16, 16, 10, 8, 10, 4, 110, 52, 0, 0, 16, 15, 10, 8, 10, 4, 110, 56, 0, 0, 16, 13, 10, 8, 10, 4, 110, 64, 0, 0, 16, 15, 10, 8, 10, 4, 110, 72, 0, 0, 16, 15, 10, 8, 10, 4, 110, 75, 0, 0, 16, 17, 10, 8, 10, 4, 110, 75, 128, 0, 16, 19, 10, 8, 10, 4, 110, 75, 160, 0, 16, 19, 10, 8, 10, 4, 110, 75, 192, 0, 16, 18, 10, 8, 10, 4, 110, 76, 0, 0, 16, 19, 10, 8, 10, 4, 110, 76, 32, 0, 16, 19, 10, 8, 10, 4, 110, 76, 132, 0, 16, 22, 10, 8, 10, 4, 110, 76, 156, 0, 16, 22, 10, 8, 10, 4, 110, 76, 184, 0, 16, 22, 10, 8, 10, 4, 110, 76, 192, 0, 16, 18, 10, 8, 10, 4, 110, 77, 0, 0, 16, 17, 10, 8, 10, 4, 110, 80, 0, 0, 16, 13, 10, 8, 10, 4, 110, 88, 0, 0, 16, 14, 10, 8, 10, 4, 110, 92, 68, 0, 16, 22, 10, 8, 10, 4, 110, 93, 32, 0, 16, 19, 10, 8, 10, 4, 110, 94, 0, 0, 16, 15, 10, 8, 10, 4, 110, 96, 0, 0, 16, 11, 10, 8, 10, 4, 110, 152, 0, 0, 16, 14, 10, 8, 10, 4, 110, 156, 0, 0, 16, 15, 10, 8, 10, 4, 110, 165, 32, 0, 16, 19, 10, 8, 10, 4, 110, 166, 0, 0, 16, 15, 10, 8, 10, 4, 110, 172, 192, 0, 16, 18, 10, 8, 10, 4, 110, 173, 0, 0, 16, 19, 10, 8, 10, 4, 110, 173, 32, 0, 16, 20, 10, 8, 10, 4, 110, 173, 64, 0, 16, 19, 10, 8, 10, 4, 110, 173, 96, 0, 16, 19, 10, 8, 10, 4, 110, 173, 192, 0, 16, 19, 10, 8, 10, 4, 110, 176, 0, 0, 16, 13, 10, 8, 10, 4, 110, 184, 0, 0, 16, 13, 10, 8, 10, 4, 110, 192, 0, 0, 16, 11, 10, 8, 10, 4, 110, 228, 0, 0, 16, 14, 10, 8, 10, 4, 110, 232, 32, 0, 16, 19, 10, 8, 10, 4, 110, 236, 0, 0, 16, 15, 10, 8, 10, 4, 110, 240, 0, 0, 16, 12, 10, 8, 10, 4, 111, 0, 0, 0, 16, 10, 10, 8, 10, 4, 111, 66, 0, 0, 16, 16, 10, 8, 10, 4, 111, 67, 192, 0, 16, 20, 10, 8, 10, 4, 111, 68, 64, 0, 16, 19, 10, 8, 10, 4, 111, 72, 0, 0, 16, 13, 10, 8, 10, 4, 111, 85, 0, 0, 16, 16, 10, 8, 10, 4, 111, 91, 192, 0, 16, 19, 10, 8, 10, 4, 111, 92, 248, 0, 16, 22, 10, 8, 10, 4, 111, 92, 252, 0, 16, 22, 10, 8, 10, 4, 111, 112, 0, 0, 16, 15, 10, 8, 10, 4, 111, 114, 0, 0, 16, 15, 10, 8, 10, 4, 111, 116, 0, 0, 16, 15, 10, 8, 10, 4, 111, 118, 200, 0, 16, 21, 10, 8, 10, 4, 111, 119, 64, 0, 16, 18, 10, 8, 10, 4, 111, 119, 128, 0, 16, 19, 10, 8, 10, 4, 111, 120, 0, 0, 16, 14, 10, 8, 10, 4, 111, 124, 0, 0, 16, 16, 10, 8, 10, 4, 111, 126, 0, 0, 16, 15, 10, 8, 10, 4, 111, 128, 0, 0, 16, 11, 10, 8, 10, 4, 111, 160, 0, 0, 16, 13, 10, 8, 10, 4, 111, 170, 0, 0, 16, 16, 10, 8, 10, 4, 111, 172, 0, 0, 16, 14, 10, 8, 10, 4, 111, 176, 0, 0, 16, 13, 10, 8, 10, 4, 111, 186, 0, 0, 16, 15, 10, 8, 10, 4, 111, 192, 0, 0, 16, 12, 10, 8, 10, 4, 111, 208, 0, 0, 16, 14, 10, 8, 10, 4, 111, 212, 0, 0, 16, 14, 10, 8, 10, 4, 111, 221, 28, 0, 16, 24, 10, 8, 10, 4, 111, 221, 128, 0, 16, 17, 10, 8, 10, 4, 111, 222, 0, 0, 16, 16, 10, 8, 10, 4, 111, 223, 4, 0, 16, 22, 10, 8, 10, 4, 111, 223, 8, 0, 16, 22, 10, 8, 10, 4, 111, 223, 12, 0, 16, 22, 10, 8, 10, 4, 111, 223, 16, 0, 16, 22, 10, 8, 10, 4, 111, 223, 240, 0, 16, 22, 10, 8, 10, 4, 111, 223, 248, 0, 16, 22, 10, 8, 10, 4, 111, 224, 0, 0, 16, 14, 10, 8, 10, 4, 111, 228, 0, 0, 16, 14, 10, 8, 10, 4, 111, 235, 96, 0, 16, 19, 10, 8, 10, 4, 111, 235, 156, 0, 16, 22, 10, 8, 10, 4, 111, 235, 160, 0, 16, 19, 10, 8, 10, 4, 112, 0, 0, 0, 16, 10, 10, 8, 10, 4, 112, 64, 0, 0, 16, 15, 10, 8, 10, 4, 112, 66, 0, 0, 16, 15, 10, 8, 10, 4, 112, 73, 0, 0, 16, 16, 10, 8, 10, 4, 112, 74, 0, 0, 16, 15, 10, 8, 10, 4, 112, 80, 0, 0, 16, 13, 10, 8, 10, 4, 112, 88, 0, 0, 16, 13, 10, 8, 10, 4, 112, 96, 0, 0, 16, 15, 10, 8, 10, 4, 112, 98, 0, 0, 16, 15, 10, 8, 10, 4, 112, 100, 0, 0, 16, 14, 10, 8, 10, 4, 112, 109, 128, 0, 16, 17, 10, 8, 10, 4, 112, 111, 0, 0, 16, 16, 10, 8, 10, 4, 112, 112, 0, 0, 16, 14, 10, 8, 10, 4, 112, 116, 0, 0, 16, 15, 10, 8, 10, 4, 112, 122, 0, 0, 16, 15, 10, 8, 10, 4, 112, 124, 0, 0, 16, 14, 10, 8, 10, 4, 112, 128, 0, 0, 16, 14, 10, 8, 10, 4, 112, 132, 0, 0, 16, 16, 10, 8, 10, 4, 112, 137, 48, 0, 16, 21, 10, 8, 10, 4, 112, 192, 0, 0, 16, 14, 10, 8, 10, 4, 112, 224, 0, 0, 16, 11, 10, 8, 10, 4, 113, 0, 0, 0, 16, 13, 10, 8, 10, 4, 113, 8, 0, 0, 16, 15, 10, 8, 10, 4, 113, 11, 192, 0, 16, 19, 10, 8, 10, 4, 113, 12, 0, 0, 16, 14, 10, 8, 10, 4, 113, 16, 0, 0, 16, 15, 10, 8, 10, 4, 113, 18, 0, 0, 16, 16, 10, 8, 10, 4, 113, 21, 232, 0, 16, 22, 10, 8, 10, 4, 113, 21, 236, 0, 16, 22, 10, 8, 10, 4, 113, 24, 0, 0, 16, 14, 10, 8, 10, 4, 113, 31, 0, 0, 16, 16, 10, 8, 10, 4, 113, 44, 0, 0, 16, 14, 10, 8, 10, 4, 113, 48, 0, 0, 16, 14, 10, 8, 10, 4, 113, 52, 160, 0, 16, 19, 10, 8, 10, 4, 113, 52, 228, 0, 16, 22, 10, 8, 10, 4, 113, 54, 0, 0, 16, 15, 10, 8, 10, 4, 113, 56, 0, 0, 16, 15, 10, 8, 10, 4, 113, 58, 0, 0, 16, 16, 10, 8, 10, 4, 113, 59, 0, 0, 16, 17, 10, 8, 10, 4, 113, 59, 224, 0, 16, 22, 10, 8, 10, 4, 113, 62, 0, 0, 16, 15, 10, 8, 10, 4, 113, 64, 0, 0, 16, 11, 10, 8, 10, 4, 113, 96, 0, 0, 16, 12, 10, 8, 10, 4, 113, 112, 0, 0, 16, 13, 10, 8, 10, 4, 113, 120, 0, 0, 16, 13, 10, 8, 10, 4, 113, 128, 0, 0, 16, 15, 10, 8, 10, 4, 113, 130, 96, 0, 16, 20, 10, 8, 10, 4, 113, 130, 112, 0, 16, 21, 10, 8, 10, 4, 113, 132, 0, 0, 16, 14, 10, 8, 10, 4, 113, 136, 0, 0, 16, 13, 10, 8, 10, 4, 113, 194, 0, 0, 16, 15, 10, 8, 10, 4, 113, 197, 100, 0, 16, 22, 10, 8, 10, 4, 113, 200, 0, 0, 16, 15, 10, 8, 10, 4, 113, 202, 0, 0, 16, 16, 10, 8, 10, 4, 113, 204, 0, 0, 16, 14, 10, 8, 10, 4, 113, 208, 96, 0, 16, 19, 10, 8, 10, 4, 113, 208, 128, 0, 16, 17, 10, 8, 10, 4, 113, 209, 0, 0, 16, 16, 10, 8, 10, 4, 113, 212, 0, 0, 16, 18, 10, 8, 10, 4, 113, 212, 100, 0, 16, 22, 10, 8, 10, 4, 113, 212, 184, 0, 16, 21, 10, 8, 10, 4, 113, 213, 0, 0, 16, 17, 10, 8, 10, 4, 113, 214, 0, 0, 16, 15, 10, 8, 10, 4, 113, 218, 0, 0, 16, 15, 10, 8, 10, 4, 113, 220, 0, 0, 16, 14, 10, 8, 10, 4, 113, 224, 0, 0, 16, 12, 10, 8, 10, 4, 113, 240, 0, 0, 16, 13, 10, 8, 10, 4, 113, 248, 0, 0, 16, 14, 10, 8, 10, 4, 114, 28, 0, 0, 16, 16, 10, 8, 10, 4, 114, 31, 64, 0, 16, 22, 10, 8, 10, 4, 114, 31, 68, 0, 16, 22, 10, 8, 10, 4, 114, 54, 0, 0, 16, 15, 10, 8, 10, 4, 114, 60, 0, 0, 16, 14, 10, 8, 10, 4, 114, 64, 0, 0, 16, 14, 10, 8, 10, 4, 114, 68, 0, 0, 16, 16, 10, 8, 10, 4, 114, 79, 64, 0, 16, 18, 10, 8, 10, 4, 114, 80, 0, 0, 16, 12, 10, 8, 10, 4, 114, 96, 0, 0, 16, 13, 10, 8, 10, 4, 114, 104, 0, 0, 16, 14, 10, 8, 10, 4, 114, 110, 0, 0, 16, 20, 10, 8, 10, 4, 114, 110, 64, 0, 16, 18, 10, 8, 10, 4, 114, 111, 0, 0, 16, 19, 10, 8, 10, 4, 114, 111, 160, 0, 16, 19, 10, 8, 10, 4, 114, 112, 0, 0, 16, 14, 10, 8, 10, 4, 114, 116, 0, 0, 16, 16, 10, 8, 10, 4, 114, 117, 0, 0, 16, 16, 10, 8, 10, 4, 114, 118, 0, 0, 16, 16, 10, 8, 10, 4, 114, 119, 0, 0, 16, 17, 10, 8, 10, 4, 114, 119, 128, 0, 16, 18, 10, 8, 10, 4, 114, 119, 192, 0, 16, 21, 10, 8, 10, 4, 114, 119, 200, 0, 16, 22, 10, 8, 10, 4, 114, 119, 204, 0, 16, 22, 10, 8, 10, 4, 114, 119, 208, 0, 16, 20, 10, 8, 10, 4, 114, 119, 224, 0, 16, 19, 10, 8, 10, 4, 114, 132, 0, 0, 16, 16, 10, 8, 10, 4, 114, 135, 0, 0, 16, 16, 10, 8, 10, 4, 114, 138, 0, 0, 16, 15, 10, 8, 10, 4, 114, 141, 64, 0, 16, 21, 10, 8, 10, 4, 114, 141, 80, 0, 16, 22, 10, 8, 10, 4, 114, 141, 84, 0, 16, 22, 10, 8, 10, 4, 114, 141, 128, 0, 16, 18, 10, 8, 10, 4, 114, 196, 0, 0, 16, 15, 10, 8, 10, 4, 114, 198, 248, 0, 16, 21, 10, 8, 10, 4, 114, 208, 0, 0, 16, 14, 10, 8, 10, 4, 114, 212, 0, 0, 16, 15, 10, 8, 10, 4, 114, 214, 0, 0, 16, 16, 10, 8, 10, 4, 114, 215, 0, 0, 16, 16, 10, 8, 10, 4, 114, 216, 0, 0, 16, 13, 10, 8, 10, 4, 114, 224, 0, 0, 16, 12, 10, 8, 10, 4, 114, 240, 0, 0, 16, 12, 10, 8, 10, 4, 115, 24, 0, 0, 16, 14, 10, 8, 10, 4, 115, 28, 0, 0, 16, 15, 10, 8, 10, 4, 115, 31, 64, 0, 16, 22, 10, 8, 10, 4, 115, 31, 68, 0, 16, 22, 10, 8, 10, 4, 115, 31, 72, 0, 16, 22, 10, 8, 10, 4, 115, 31, 76, 0, 16, 22, 10, 8, 10, 4, 115, 32, 0, 0, 16, 14, 10, 8, 10, 4, 115, 42, 56, 0, 16, 22, 10, 8, 10, 4, 115, 44, 0, 0, 16, 15, 10, 8, 10, 4, 115, 46, 0, 0, 16, 16, 10, 8, 10, 4, 115, 47, 0, 0, 16, 16, 10, 8, 10, 4, 115, 48, 0, 0, 16, 12, 10, 8, 10, 4, 115, 69, 64, 0, 16, 20, 10, 8, 10, 4, 115, 84, 0, 0, 16, 18, 10, 8, 10, 4, 115, 84, 192, 0, 16, 19, 10, 8, 10, 4, 115, 85, 192, 0, 16, 18, 10, 8, 10, 4, 115, 100, 0, 0, 16, 14, 10, 8, 10, 4, 115, 104, 0, 0, 16, 14, 10, 8, 10, 4, 115, 120, 0, 0, 16, 14, 10, 8, 10, 4, 115, 124, 16, 0, 16, 20, 10, 8, 10, 4, 115, 148, 0, 0, 16, 14, 10, 8, 10, 4, 115, 152, 0, 0, 16, 15, 10, 8, 10, 4, 115, 154, 0, 0, 16, 15, 10, 8, 10, 4, 115, 156, 0, 0, 16, 15, 10, 8, 10, 4, 115, 158, 0, 0, 16, 16, 10, 8, 10, 4, 115, 159, 0, 0, 16, 16, 10, 8, 10, 4, 115, 166, 64, 0, 16, 19, 10, 8, 10, 4, 115, 168, 0, 0, 16, 14, 10, 8, 10, 4, 115, 172, 0, 0, 16, 14, 10, 8, 10, 4, 115, 180, 0, 0, 16, 14, 10, 8, 10, 4, 115, 187, 0, 0, 16, 22, 10, 8, 10, 4, 115, 187, 4, 0, 16, 22, 10, 8, 10, 4, 115, 187, 8, 0, 16, 22, 10, 8, 10, 4, 115, 187, 12, 0, 16, 22, 10, 8, 10, 4, 115, 190, 0, 0, 16, 15, 10, 8, 10, 4, 115, 192, 0, 0, 16, 11, 10, 8, 10, 4, 115, 224, 0, 0, 16, 12, 10, 8, 10, 4, 116, 0, 8, 0, 16, 21, 10, 8, 10, 4, 116, 0, 24, 0, 16, 21, 10, 8, 10, 4, 116, 1, 0, 0, 16, 16, 10, 8, 10, 4, 116, 2, 0, 0, 16, 15, 10, 8, 10, 4, 116, 4, 0, 0, 16, 14, 10, 8, 10, 4, 116, 8, 0, 0, 16, 14, 10, 8, 10, 4, 116, 13, 0, 0, 16, 16, 10, 8, 10, 4, 116, 16, 0, 0, 16, 12, 10, 8, 10, 4, 116, 50, 0, 0, 16, 20, 10, 8, 10, 4, 116, 52, 0, 0, 16, 14, 10, 8, 10, 4, 116, 56, 0, 0, 16, 15, 10, 8, 10, 4, 116, 58, 128, 0, 16, 20, 10, 8, 10, 4, 116, 58, 208, 0, 16, 20, 10, 8, 10, 4, 116, 60, 0, 0, 16, 14, 10, 8, 10, 4, 116, 66, 0, 0, 16, 17, 10, 8, 10, 4, 116, 66, 176, 0, 16, 22, 10, 8, 10, 4, 116, 68, 136, 0, 16, 22, 10, 8, 10, 4, 116, 68, 140, 0, 16, 22, 10, 8, 10, 4, 116, 68, 176, 0, 16, 22, 10, 8, 10, 4, 116, 68, 180, 0, 16, 22, 10, 8, 10, 4, 116, 69, 0, 0, 16, 16, 10, 8, 10, 4, 116, 70, 0, 0, 16, 17, 10, 8, 10, 4, 116, 76, 0, 0, 16, 15, 10, 8, 10, 4, 116, 78, 0, 0, 16, 15, 10, 8, 10, 4, 116, 85, 0, 0, 16, 16, 10, 8, 10, 4, 116, 89, 144, 0, 16, 20, 10, 8, 10, 4, 116, 89, 240, 0, 16, 22, 10, 8, 10, 4, 116, 90, 80, 0, 16, 20, 10, 8, 10, 4, 116, 90, 184, 0, 16, 21, 10, 8, 10, 4, 116, 95, 0, 0, 16, 16, 10, 8, 10, 4, 116, 112, 0, 0, 16, 14, 10, 8, 10, 4, 116, 116, 0, 0, 16, 15, 10, 8, 10, 4, 116, 128, 0, 0, 16, 10, 10, 8, 10, 4, 116, 192, 0, 0, 16, 16, 10, 8, 10, 4, 116, 193, 16, 0, 16, 20, 10, 8, 10, 4, 116, 193, 32, 0, 16, 19, 10, 8, 10, 4, 116, 193, 152, 0, 16, 22, 10, 8, 10, 4, 116, 193, 164, 0, 16, 22, 10, 8, 10, 4, 116, 193, 176, 0, 16, 21, 10, 8, 10, 4, 116, 194, 0, 0, 16, 15, 10, 8, 10, 4, 116, 196, 0, 0, 16, 16, 10, 8, 10, 4, 116, 197, 160, 0, 16, 22, 10, 8, 10, 4, 116, 197, 164, 0, 16, 22, 10, 8, 10, 4, 116, 198, 0, 0, 16, 16, 10, 8, 10, 4, 116, 199, 0, 0, 16, 17, 10, 8, 10, 4, 116, 199, 128, 0, 16, 19, 10, 8, 10, 4, 116, 204, 0, 0, 16, 17, 10, 8, 10, 4, 116, 205, 0, 0, 16, 16, 10, 8, 10, 4, 116, 206, 92, 0, 16, 22, 10, 8, 10, 4, 116, 206, 100, 0, 16, 22, 10, 8, 10, 4, 116, 206, 176, 0, 16, 22, 10, 8, 10, 4, 116, 207, 0, 0, 16, 16, 10, 8, 10, 4, 116, 208, 0, 0, 16, 14, 10, 8, 10, 4, 116, 212, 160, 0, 16, 20, 10, 8, 10, 4, 116, 213, 40, 0, 16, 22, 10, 8, 10, 4, 116, 213, 44, 0, 16, 22, 10, 8, 10, 4, 116, 213, 64, 0, 16, 18, 10, 8, 10, 4, 116, 213, 128, 0, 16, 17, 10, 8, 10, 4, 116, 214, 32, 0, 16, 19, 10, 8, 10, 4, 116, 214, 64, 0, 16, 20, 10, 8, 10, 4, 116, 214, 128, 0, 16, 17, 10, 8, 10, 4, 116, 215, 0, 0, 16, 16, 10, 8, 10, 4, 116, 216, 0, 0, 16, 14, 10, 8, 10, 4, 116, 224, 0, 0, 16, 12, 10, 8, 10, 4, 116, 242, 0, 0, 16, 15, 10, 8, 10, 4, 116, 244, 0, 0, 16, 15, 10, 8, 10, 4, 116, 246, 0, 0, 16, 15, 10, 8, 10, 4, 116, 248, 0, 0, 16, 15, 10, 8, 10, 4, 116, 251, 64, 0, 16, 18, 10, 8, 10, 4, 116, 252, 0, 0, 16, 15, 10, 8, 10, 4, 116, 254, 104, 0, 16, 22, 10, 8, 10, 4, 116, 254, 108, 0, 16, 22, 10, 8, 10, 4, 116, 254, 128, 0, 16, 17, 10, 8, 10, 4, 116, 255, 128, 0, 16, 17, 10, 8, 10, 4, 117, 8, 0, 0, 16, 13, 10, 8, 10, 4, 117, 21, 0, 0, 16, 16, 10, 8, 10, 4, 117, 22, 0, 0, 16, 15, 10, 8, 10, 4, 117, 24, 0, 0, 16, 13, 10, 8, 10, 4, 117, 32, 0, 0, 16, 13, 10, 8, 10, 4, 117, 40, 0, 0, 16, 14, 10, 8, 10, 4, 117, 44, 0, 0, 16, 15, 10, 8, 10, 4, 117, 48, 0, 0, 16, 14, 10, 8, 10, 4, 117, 53, 48, 0, 16, 20, 10, 8, 10, 4, 117, 53, 176, 0, 16, 20, 10, 8, 10, 4, 117, 57, 0, 0, 16, 16, 10, 8, 10, 4, 117, 58, 0, 0, 16, 17, 10, 8, 10, 4, 117, 59, 0, 0, 16, 16, 10, 8, 10, 4, 117, 60, 0, 0, 16, 14, 10, 8, 10, 4, 117, 64, 0, 0, 16, 13, 10, 8, 10, 4, 117, 72, 0, 0, 16, 15, 10, 8, 10, 4, 117, 74, 64, 0, 16, 20, 10, 8, 10, 4, 117, 74, 80, 0, 16, 20, 10, 8, 10, 4, 117, 74, 128, 0, 16, 17, 10, 8, 10, 4, 117, 75, 0, 0, 16, 16, 10, 8, 10, 4, 117, 76, 0, 0, 16, 14, 10, 8, 10, 4, 117, 80, 0, 0, 16, 12, 10, 8, 10, 4, 117, 100, 0, 0, 16, 15, 10, 8, 10, 4, 117, 103, 16, 0, 16, 20, 10, 8, 10, 4, 117, 103, 40, 0, 16, 21, 10, 8, 10, 4, 117, 103, 72, 0, 16, 21, 10, 8, 10, 4, 117, 103, 128, 0, 16, 20, 10, 8, 10, 4, 117, 104, 168, 0, 16, 21, 10, 8, 10, 4, 117, 106, 0, 0, 16, 15, 10, 8, 10, 4, 117, 112, 0, 0, 16, 13, 10, 8, 10, 4, 117, 120, 64, 0, 16, 18, 10, 8, 10, 4, 117, 120, 128, 0, 16, 17, 10, 8, 10, 4, 117, 121, 0, 0, 16, 17, 10, 8, 10, 4, 117, 121, 128, 0, 16, 18, 10, 8, 10, 4, 117, 121, 192, 0, 16, 21, 10, 8, 10, 4, 117, 122, 128, 0, 16, 17, 10, 8, 10, 4, 117, 124, 0, 0, 16, 14, 10, 8, 10, 4, 117, 128, 0, 0, 16, 10, 10, 8, 10, 4, 118, 24, 0, 0, 16, 15, 10, 8, 10, 4, 118, 26, 0, 0, 16, 16, 10, 8, 10, 4, 118, 28, 0, 0, 16, 15, 10, 8, 10, 4, 118, 30, 0, 0, 16, 16, 10, 8, 10, 4, 118, 31, 0, 0, 16, 16, 10, 8, 10, 4, 118, 64, 0, 0, 16, 15, 10, 8, 10, 4, 118, 66, 0, 0, 16, 16, 10, 8, 10, 4, 118, 67, 112, 0, 16, 20, 10, 8, 10, 4, 118, 72, 0, 0, 16, 13, 10, 8, 10, 4, 118, 80, 0, 0, 16, 15, 10, 8, 10, 4, 118, 84, 0, 0, 16, 15, 10, 8, 10, 4, 118, 88, 32, 0, 16, 19, 10, 8, 10, 4, 118, 88, 64, 0, 16, 18, 10, 8, 10, 4, 118, 88, 128, 0, 16, 17, 10, 8, 10, 4, 118, 89, 0, 0, 16, 16, 10, 8, 10, 4, 118, 91, 240, 0, 16, 20, 10, 8, 10, 4, 118, 102, 16, 0, 16, 20, 10, 8, 10, 4, 118, 102, 32, 0, 16, 21, 10, 8, 10, 4, 118, 103, 164, 0, 16, 22, 10, 8, 10, 4, 118, 103, 168, 0, 16, 22, 10, 8, 10, 4, 118, 103, 172, 0, 16, 22, 10, 8, 10, 4, 118, 103, 176, 0, 16, 22, 10, 8, 10, 4, 118, 107, 180, 0, 16, 22, 10, 8, 10, 4, 118, 112, 0, 0, 16, 13, 10, 8, 10, 4, 118, 120, 0, 0, 16, 14, 10, 8, 10, 4, 118, 124, 0, 0, 16, 15, 10, 8, 10, 4, 118, 126, 0, 0, 16, 16, 10, 8, 10, 4, 118, 127, 128, 0, 16, 19, 10, 8, 10, 4, 118, 132, 0, 0, 16, 14, 10, 8, 10, 4, 118, 144, 0, 0, 16, 14, 10, 8, 10, 4, 118, 178, 0, 0, 16, 16, 10, 8, 10, 4, 118, 180, 0, 0, 16, 14, 10, 8, 10, 4, 118, 184, 0, 0, 16, 17, 10, 8, 10, 4, 118, 184, 128, 0, 16, 17, 10, 8, 10, 4, 118, 186, 0, 0, 16, 15, 10, 8, 10, 4, 118, 188, 0, 0, 16, 16, 10, 8, 10, 4, 118, 190, 0, 0, 16, 16, 10, 8, 10, 4, 118, 191, 0, 0, 16, 16, 10, 8, 10, 4, 118, 192, 0, 0, 16, 16, 10, 8, 10, 4, 118, 193, 0, 0, 16, 20, 10, 8, 10, 4, 118, 193, 32, 0, 16, 19, 10, 8, 10, 4, 118, 193, 64, 0, 16, 20, 10, 8, 10, 4, 118, 193, 96, 0, 16, 19, 10, 8, 10, 4, 118, 193, 128, 0, 16, 17, 10, 8, 10, 4, 118, 194, 0, 0, 16, 17, 10, 8, 10, 4, 118, 194, 128, 0, 16, 17, 10, 8, 10, 4, 118, 195, 0, 0, 16, 17, 10, 8, 10, 4, 118, 195, 128, 0, 16, 17, 10, 8, 10, 4, 118, 196, 0, 0, 16, 14, 10, 8, 10, 4, 118, 202, 0, 0, 16, 15, 10, 8, 10, 4, 118, 204, 0, 0, 16, 14, 10, 8, 10, 4, 118, 212, 0, 0, 16, 16, 10, 8, 10, 4, 118, 213, 0, 0, 16, 16, 10, 8, 10, 4, 118, 215, 192, 0, 16, 18, 10, 8, 10, 4, 118, 224, 0, 0, 16, 14, 10, 8, 10, 4, 118, 228, 0, 0, 16, 15, 10, 8, 10, 4, 118, 230, 0, 0, 16, 16, 10, 8, 10, 4, 118, 239, 0, 0, 16, 16, 10, 8, 10, 4, 118, 242, 0, 0, 16, 16, 10, 8, 10, 4, 118, 244, 0, 0, 16, 14, 10, 8, 10, 4, 118, 248, 0, 0, 16, 13, 10, 8, 10, 4, 119, 0, 0, 0, 16, 15, 10, 8, 10, 4, 119, 2, 0, 0, 16, 19, 10, 8, 10, 4, 119, 2, 128, 0, 16, 17, 10, 8, 10, 4, 119, 3, 0, 0, 16, 16, 10, 8, 10, 4, 119, 4, 0, 0, 16, 14, 10, 8, 10, 4, 119, 8, 0, 0, 16, 16, 10, 8, 10, 4, 119, 10, 0, 0, 16, 17, 10, 8, 10, 4, 119, 15, 136, 0, 16, 21, 10, 8, 10, 4, 119, 16, 0, 0, 16, 16, 10, 8, 10, 4, 119, 18, 192, 0, 16, 20, 10, 8, 10, 4, 119, 18, 208, 0, 16, 21, 10, 8, 10, 4, 119, 18, 224, 0, 16, 20, 10, 8, 10, 4, 119, 18, 240, 0, 16, 20, 10, 8, 10, 4, 119, 19, 0, 0, 16, 16, 10, 8, 10, 4, 119, 20, 0, 0, 16, 14, 10, 8, 10, 4, 119, 27, 64, 0, 16, 18, 10, 8, 10, 4, 119, 27, 128, 0, 16, 19, 10, 8, 10, 4, 119, 27, 160, 0, 16, 19, 10, 8, 10, 4, 119, 27, 192, 0, 16, 18, 10, 8, 10, 4, 119, 28, 0, 0, 16, 15, 10, 8, 10, 4, 119, 30, 48, 0, 16, 20, 10, 8, 10, 4, 119, 31, 192, 0, 16, 19, 10, 8, 10, 4, 119, 32, 0, 0, 16, 14, 10, 8, 10, 4, 119, 36, 0, 0, 16, 16, 10, 8, 10, 4, 119, 37, 0, 0, 16, 17, 10, 8, 10, 4, 119, 37, 128, 0, 16, 18, 10, 8, 10, 4, 119, 37, 192, 0, 16, 18, 10, 8, 10, 4, 119, 38, 0, 0, 16, 17, 10, 8, 10, 4, 119, 38, 128, 0, 16, 18, 10, 8, 10, 4, 119, 38, 192, 0, 16, 20, 10, 8, 10, 4, 119, 38, 208, 0, 16, 20, 10, 8, 10, 4, 119, 38, 224, 0, 16, 19, 10, 8, 10, 4, 119, 39, 0, 0, 16, 16, 10, 8, 10, 4, 119, 40, 0, 0, 16, 18, 10, 8, 10, 4, 119, 40, 64, 0, 16, 20, 10, 8, 10, 4, 119, 40, 128, 0, 16, 17, 10, 8, 10, 4, 119, 41, 0, 0, 16, 16, 10, 8, 10, 4, 119, 42, 0, 0, 16, 19, 10, 8, 10, 4, 119, 42, 52, 0, 16, 22, 10, 8, 10, 4, 119, 42, 128, 0, 16, 21, 10, 8, 10, 4, 119, 42, 136, 0, 16, 21, 10, 8, 10, 4, 119, 42, 224, 0, 16, 19, 10, 8, 10, 4, 119, 44, 0, 0, 16, 15, 10, 8, 10, 4, 119, 48, 0, 0, 16, 13, 10, 8, 10, 4, 119, 57, 0, 0, 16, 16, 10, 8, 10, 4, 119, 58, 0, 0, 16, 16, 10, 8, 10, 4, 119, 59, 128, 0, 16, 17, 10, 8, 10, 4, 119, 60, 0, 0, 16, 16, 10, 8, 10, 4, 119, 61, 0, 0, 16, 16, 10, 8, 10, 4, 119, 62, 0, 0, 16, 16, 10, 8, 10, 4, 119, 63, 32, 0, 16, 19, 10, 8, 10, 4, 119, 75, 208, 0, 16, 20, 10, 8, 10, 4, 119, 78, 0, 0, 16, 15, 10, 8, 10, 4, 119, 80, 0, 0, 16, 16, 10, 8, 10, 4, 119, 82, 208, 0, 16, 20, 10, 8, 10, 4, 119, 84, 0, 0, 16, 14, 10, 8, 10, 4, 119, 88, 0, 0, 16, 14, 10, 8, 10, 4, 119, 96, 0, 0, 16, 13, 10, 8, 10, 4, 119, 108, 0, 0, 16, 15, 10, 8, 10, 4, 119, 112, 0, 0, 16, 13, 10, 8, 10, 4, 119, 120, 0, 0, 16, 13, 10, 8, 10, 4, 119, 128, 0, 0, 16, 12, 10, 8, 10, 4, 119, 144, 0, 0, 16, 14, 10, 8, 10, 4, 119, 148, 160, 0, 16, 20, 10, 8, 10, 4, 119, 148, 176, 0, 16, 20, 10, 8, 10, 4, 119, 151, 192, 0, 16, 18, 10, 8, 10, 4, 119, 160, 200, 0, 16, 21, 10, 8, 10, 4, 119, 161, 120, 0, 16, 22, 10, 8, 10, 4, 119, 161, 124, 0, 16, 22, 10, 8, 10, 4, 119, 161, 128, 0, 16, 17, 10, 8, 10, 4, 119, 162, 0, 0, 16, 15, 10, 8, 10, 4, 119, 164, 0, 0, 16, 14, 10, 8, 10, 4, 119, 176, 0, 0, 16, 12, 10, 8, 10, 4, 119, 232, 0, 0, 16, 15, 10, 8, 10, 4, 119, 235, 128, 0, 16, 18, 10, 8, 10, 4, 119, 248, 0, 0, 16, 14, 10, 8, 10, 4, 119, 252, 96, 0, 16, 21, 10, 8, 10, 4, 119, 252, 240, 0, 16, 20, 10, 8, 10, 4, 119, 253, 0, 0, 16, 16, 10, 8, 10, 4, 119, 254, 0, 0, 16, 15, 10, 8, 10, 4, 120, 0, 0, 0, 16, 12, 10, 8, 10, 4, 120, 24, 0, 0, 16, 14, 10, 8, 10, 4, 120, 30, 0, 0, 16, 16, 10, 8, 10, 4, 120, 31, 0, 0, 16, 16, 10, 8, 10, 4, 120, 32, 0, 0, 16, 13, 10, 8, 10, 4, 120, 40, 0, 0, 16, 14, 10, 8, 10, 4, 120, 44, 0, 0, 16, 14, 10, 8, 10, 4, 120, 48, 0, 0, 16, 15, 10, 8, 10, 4, 120, 52, 0, 0, 16, 16, 10, 8, 10, 4, 120, 53, 0, 0, 16, 16, 10, 8, 10, 4, 120, 54, 0, 0, 16, 15, 10, 8, 10, 4, 120, 64, 0, 0, 16, 14, 10, 8, 10, 4, 120, 68, 0, 0, 16, 14, 10, 8, 10, 4, 120, 72, 32, 0, 16, 19, 10, 8, 10, 4, 120, 72, 128, 0, 16, 17, 10, 8, 10, 4, 120, 76, 0, 0, 16, 14, 10, 8, 10, 4, 120, 80, 0, 0, 16, 13, 10, 8, 10, 4, 120, 88, 8, 0, 16, 21, 10, 8, 10, 4, 120, 90, 0, 0, 16, 15, 10, 8, 10, 4, 120, 92, 0, 0, 16, 16, 10, 8, 10, 4, 120, 94, 0, 0, 16, 16, 10, 8, 10, 4, 120, 95, 0, 0, 16, 16, 10, 8, 10, 4, 120, 128, 0, 0, 16, 14, 10, 8, 10, 4, 120, 132, 0, 0, 16, 17, 10, 8, 10, 4, 120, 132, 128, 0, 16, 17, 10, 8, 10, 4, 120, 133, 0, 0, 16, 16, 10, 8, 10, 4, 120, 134, 0, 0, 16, 15, 10, 8, 10, 4, 120, 136, 16, 0, 16, 22, 10, 8, 10, 4, 120, 136, 20, 0, 16, 22, 10, 8, 10, 4, 120, 136, 128, 0, 16, 18, 10, 8, 10, 4, 120, 137, 0, 0, 16, 17, 10, 8, 10, 4, 120, 143, 128, 0, 16, 19, 10, 8, 10, 4, 120, 192, 0, 0, 16, 10, 10, 8, 10, 4, 121, 0, 8, 0, 16, 21, 10, 8, 10, 4, 121, 0, 16, 0, 16, 20, 10, 8, 10, 4, 121, 4, 0, 0, 16, 15, 10, 8, 10, 4, 121, 8, 0, 0, 16, 13, 10, 8, 10, 4, 121, 16, 0, 0, 16, 13, 10, 8, 10, 4, 121, 24, 0, 0, 16, 14, 10, 8, 10, 4, 121, 28, 0, 0, 16, 15, 10, 8, 10, 4, 121, 30, 0, 0, 16, 16, 10, 8, 10, 4, 121, 31, 0, 0, 16, 16, 10, 8, 10, 4, 121, 32, 0, 0, 16, 14, 10, 8, 10, 4, 121, 36, 0, 0, 16, 16, 10, 8, 10, 4, 121, 37, 0, 0, 16, 16, 10, 8, 10, 4, 121, 38, 0, 0, 16, 15, 10, 8, 10, 4, 121, 40, 0, 0, 16, 14, 10, 8, 10, 4, 121, 46, 0, 0, 16, 18, 10, 8, 10, 4, 121, 46, 76, 0, 16, 22, 10, 8, 10, 4, 121, 46, 128, 0, 16, 17, 10, 8, 10, 4, 121, 47, 0, 0, 16, 16, 10, 8, 10, 4, 121, 48, 0, 0, 16, 15, 10, 8, 10, 4, 121, 50, 8, 0, 16, 21, 10, 8, 10, 4, 121, 51, 0, 0, 16, 16, 10, 8, 10, 4, 121, 52, 160, 0, 16, 19, 10, 8, 10, 4, 121, 52, 208, 0, 16, 20, 10, 8, 10, 4, 121, 52, 224, 0, 16, 19, 10, 8, 10, 4, 121, 54, 176, 0, 16, 21, 10, 8, 10, 4, 121, 54, 188, 0, 16, 22, 10, 8, 10, 4, 121, 55, 0, 0, 16, 18, 10, 8, 10, 4, 121, 56, 0, 0, 16, 15, 10, 8, 10, 4, 121, 58, 0, 0, 16, 17, 10, 8, 10, 4, 121, 58, 136, 0, 16, 21, 10, 8, 10, 4, 121, 58, 144, 0, 16, 20, 10, 8, 10, 4, 121, 58, 160, 0, 16, 21, 10, 8, 10, 4, 121, 59, 0, 0, 16, 16, 10, 8, 10, 4, 121, 60, 0, 0, 16, 14, 10, 8, 10, 4, 121, 68, 0, 0, 16, 14, 10, 8, 10, 4, 121, 76, 0, 0, 16, 15, 10, 8, 10, 4, 121, 79, 128, 0, 16, 18, 10, 8, 10, 4, 121, 89, 0, 0, 16, 16, 10, 8, 10, 4, 121, 100, 128, 0, 16, 17, 10, 8, 10, 4, 121, 101, 0, 0, 16, 18, 10, 8, 10, 4, 121, 101, 208, 0, 16, 20, 10, 8, 10, 4, 121, 192, 0, 0, 16, 16, 10, 8, 10, 4, 121, 193, 0, 0, 16, 16, 10, 8, 10, 4, 121, 194, 0, 0, 16, 15, 10, 8, 10, 4, 121, 196, 0, 0, 16, 14, 10, 8, 10, 4, 121, 200, 192, 0, 16, 21, 10, 8, 10, 4, 121, 201, 0, 0, 16, 16, 10, 8, 10, 4, 121, 204, 0, 0, 16, 14, 10, 8, 10, 4, 121, 224, 0, 0, 16, 12, 10, 8, 10, 4, 121, 248, 0, 0, 16, 14, 10, 8, 10, 4, 121, 255, 0, 0, 16, 16, 10, 8, 10, 4, 122, 0, 64, 0, 16, 18, 10, 8, 10, 4, 122, 0, 128, 0, 16, 17, 10, 8, 10, 4, 122, 4, 0, 0, 16, 14, 10, 8, 10, 4, 122, 8, 0, 0, 16, 16, 10, 8, 10, 4, 122, 9, 0, 0, 16, 16, 10, 8, 10, 4, 122, 10, 0, 0, 16, 17, 10, 8, 10, 4, 122, 10, 128, 0, 16, 22, 10, 8, 10, 4, 122, 10, 132, 0, 16, 23, 10, 8, 10, 4, 122, 10, 134, 0, 16, 23, 10, 8, 10, 4, 122, 10, 136, 0, 16, 23, 10, 8, 10, 4, 122, 10, 138, 0, 16, 23, 10, 8, 10, 4, 122, 10, 140, 0, 16, 22, 10, 8, 10, 4, 122, 10, 144, 0, 16, 20, 10, 8, 10, 4, 122, 10, 160, 0, 16, 19, 10, 8, 10, 4, 122, 10, 192, 0, 16, 18, 10, 8, 10, 4, 122, 11, 0, 0, 16, 17, 10, 8, 10, 4, 122, 12, 0, 0, 16, 16, 10, 8, 10, 4, 122, 13, 0, 0, 16, 16, 10, 8, 10, 4, 122, 14, 0, 0, 16, 17, 10, 8, 10, 4, 122, 14, 128, 0, 16, 18, 10, 8, 10, 4, 122, 14, 192, 0, 16, 18, 10, 8, 10, 4, 122, 48, 0, 0, 16, 16, 10, 8, 10, 4, 122, 49, 0, 0, 16, 18, 10, 8, 10, 4, 122, 51, 0, 0, 16, 16, 10, 8, 10, 4, 122, 64, 0, 0, 16, 11, 10, 8, 10, 4, 122, 96, 0, 0, 16, 15, 10, 8, 10, 4, 122, 102, 0, 0, 16, 20, 10, 8, 10, 4, 122, 102, 64, 0, 16, 20, 10, 8, 10, 4, 122, 102, 80, 0, 16, 20, 10, 8, 10, 4, 122, 112, 0, 0, 16, 14, 10, 8, 10, 4, 122, 119, 0, 0, 16, 16, 10, 8, 10, 4, 122, 128, 100, 0, 16, 22, 10, 8, 10, 4, 122, 128, 120, 0, 16, 21, 10, 8, 10, 4, 122, 136, 0, 0, 16, 13, 10, 8, 10, 4, 122, 144, 128, 0, 16, 17, 10, 8, 10, 4, 122, 152, 192, 0, 16, 18, 10, 8, 10, 4, 122, 156, 0, 0, 16, 14, 10, 8, 10, 4, 122, 188, 0, 0, 16, 14, 10, 8, 10, 4, 122, 192, 0, 0, 16, 14, 10, 8, 10, 4, 122, 198, 0, 0, 16, 16, 10, 8, 10, 4, 122, 200, 40, 0, 16, 22, 10, 8, 10, 4, 122, 200, 44, 0, 16, 22, 10, 8, 10, 4, 122, 200, 64, 0, 16, 18, 10, 8, 10, 4, 122, 201, 48, 0, 16, 20, 10, 8, 10, 4, 122, 204, 0, 0, 16, 14, 10, 8, 10, 4, 122, 224, 0, 0, 16, 12, 10, 8, 10, 4, 122, 240, 0, 0, 16, 13, 10, 8, 10, 4, 122, 248, 24, 0, 16, 21, 10, 8, 10, 4, 122, 248, 48, 0, 16, 20, 10, 8, 10, 4, 122, 255, 64, 0, 16, 21, 10, 8, 10, 4, 123, 0, 128, 0, 16, 18, 10, 8, 10, 4, 123, 4, 0, 0, 16, 14, 10, 8, 10, 4, 123, 8, 0, 0, 16, 13, 10, 8, 10, 4, 123, 49, 128, 0, 16, 17, 10, 8, 10, 4, 123, 50, 160, 0, 16, 19, 10, 8, 10, 4, 123, 52, 0, 0, 16, 14, 10, 8, 10, 4, 123, 56, 0, 0, 16, 15, 10, 8, 10, 4, 123, 58, 0, 0, 16, 20, 10, 8, 10, 4, 123, 58, 16, 0, 16, 20, 10, 8, 10, 4, 123, 58, 32, 0, 16, 19, 10, 8, 10, 4, 123, 58, 64, 0, 16, 19, 10, 8, 10, 4, 123, 58, 96, 0, 16, 19, 10, 8, 10, 4, 123, 58, 128, 0, 16, 18, 10, 8, 10, 4, 123, 58, 192, 0, 16, 19, 10, 8, 10, 4, 123, 58, 224, 0, 16, 20, 10, 8, 10, 4, 123, 58, 240, 0, 16, 20, 10, 8, 10, 4, 123, 59, 0, 0, 16, 16, 10, 8, 10, 4, 123, 60, 0, 0, 16, 16, 10, 8, 10, 4, 123, 61, 0, 0, 16, 16, 10, 8, 10, 4, 123, 62, 0, 0, 16, 16, 10, 8, 10, 4, 123, 64, 0, 0, 16, 11, 10, 8, 10, 4, 123, 96, 0, 0, 16, 15, 10, 8, 10, 4, 123, 98, 0, 0, 16, 17, 10, 8, 10, 4, 123, 99, 128, 0, 16, 17, 10, 8, 10, 4, 123, 100, 0, 0, 16, 19, 10, 8, 10, 4, 123, 101, 0, 0, 16, 16, 10, 8, 10, 4, 123, 103, 0, 0, 16, 17, 10, 8, 10, 4, 123, 108, 128, 0, 16, 20, 10, 8, 10, 4, 123, 108, 208, 0, 16, 20, 10, 8, 10, 4, 123, 112, 0, 0, 16, 12, 10, 8, 10, 4, 123, 128, 0, 0, 16, 13, 10, 8, 10, 4, 123, 136, 80, 0, 16, 20, 10, 8, 10, 4, 123, 137, 0, 0, 16, 16, 10, 8, 10, 4, 123, 138, 0, 0, 16, 15, 10, 8, 10, 4, 123, 144, 0, 0, 16, 14, 10, 8, 10, 4, 123, 148, 0, 0, 16, 16, 10, 8, 10, 4, 123, 149, 0, 0, 16, 16, 10, 8, 10, 4, 123, 150, 0, 0, 16, 15, 10, 8, 10, 4, 123, 152, 0, 0, 16, 13, 10, 8, 10, 4, 123, 160, 0, 0, 16, 14, 10, 8, 10, 4, 123, 164, 0, 0, 16, 14, 10, 8, 10, 4, 123, 168, 0, 0, 16, 14, 10, 8, 10, 4, 123, 172, 0, 0, 16, 15, 10, 8, 10, 4, 123, 174, 0, 0, 16, 15, 10, 8, 10, 4, 123, 176, 60, 0, 16, 22, 10, 8, 10, 4, 123, 176, 80, 0, 16, 20, 10, 8, 10, 4, 123, 177, 0, 0, 16, 16, 10, 8, 10, 4, 123, 178, 0, 0, 16, 15, 10, 8, 10, 4, 123, 180, 0, 0, 16, 14, 10, 8, 10, 4, 123, 184, 0, 0, 16, 14, 10, 8, 10, 4, 123, 188, 0, 0, 16, 14, 10, 8, 10, 4, 123, 196, 0, 0, 16, 15, 10, 8, 10, 4, 123, 199, 128, 0, 16, 17, 10, 8, 10, 4, 123, 206, 0, 0, 16, 15, 10, 8, 10, 4, 123, 232, 0, 0, 16, 14, 10, 8, 10, 4, 123, 242, 0, 0, 16, 17, 10, 8, 10, 4, 123, 242, 192, 0, 16, 22, 10, 8, 10, 4, 123, 242, 196, 0, 16, 22, 10, 8, 10, 4, 123, 244, 0, 0, 16, 14, 10, 8, 10, 4, 123, 249, 0, 0, 16, 16, 10, 8, 10, 4, 123, 254, 96, 0, 16, 22, 10, 8, 10, 4, 123, 254, 100, 0, 16, 22, 10, 8, 10, 4, 124, 6, 64, 0, 16, 18, 10, 8, 10, 4, 124, 14, 0, 0, 16, 15, 10, 8, 10, 4, 124, 16, 0, 0, 16, 15, 10, 8, 10, 4, 124, 20, 0, 0, 16, 16, 10, 8, 10, 4, 124, 21, 0, 0, 16, 20, 10, 8, 10, 4, 124, 21, 16, 0, 16, 20, 10, 8, 10, 4, 124, 21, 32, 0, 16, 19, 10, 8, 10, 4, 124, 21, 64, 0, 16, 18, 10, 8, 10, 4, 124, 21, 128, 0, 16, 17, 10, 8, 10, 4, 124, 22, 0, 0, 16, 15, 10, 8, 10, 4, 124, 28, 192, 0, 16, 18, 10, 8, 10, 4, 124, 29, 0, 0, 16, 17, 10, 8, 10, 4, 124, 31, 0, 0, 16, 16, 10, 8, 10, 4, 124, 40, 112, 0, 16, 20, 10, 8, 10, 4, 124, 40, 128, 0, 16, 18, 10, 8, 10, 4, 124, 40, 192, 0, 16, 19, 10, 8, 10, 4, 124, 40, 240, 0, 16, 22, 10, 8, 10, 4, 124, 42, 0, 0, 16, 17, 10, 8, 10, 4, 124, 42, 128, 0, 16, 17, 10, 8, 10, 4, 124, 47, 0, 0, 16, 18, 10, 8, 10, 4, 124, 64, 0, 0, 16, 15, 10, 8, 10, 4, 124, 66, 0, 0, 16, 17, 10, 8, 10, 4, 124, 67, 0, 0, 16, 16, 10, 8, 10, 4, 124, 68, 0, 0, 16, 14, 10, 8, 10, 4, 124, 72, 0, 0, 16, 16, 10, 8, 10, 4, 124, 73, 0, 0, 16, 16, 10, 8, 10, 4, 124, 74, 0, 0, 16, 15, 10, 8, 10, 4, 124, 76, 0, 0, 16, 14, 10, 8, 10, 4, 124, 88, 0, 0, 16, 16, 10, 8, 10, 4, 124, 89, 0, 0, 16, 17, 10, 8, 10, 4, 124, 89, 128, 0, 16, 17, 10, 8, 10, 4, 124, 90, 0, 0, 16, 15, 10, 8, 10, 4, 124, 92, 0, 0, 16, 14, 10, 8, 10, 4, 124, 108, 8, 0, 16, 21, 10, 8, 10, 4, 124, 108, 40, 0, 16, 21, 10, 8, 10, 4, 124, 109, 96, 0, 16, 21, 10, 8, 10, 4, 124, 112, 0, 0, 16, 15, 10, 8, 10, 4, 124, 114, 0, 0, 16, 15, 10, 8, 10, 4, 124, 116, 0, 0, 16, 16, 10, 8, 10, 4, 124, 117, 0, 0, 16, 16, 10, 8, 10, 4, 124, 118, 0, 0, 16, 15, 10, 8, 10, 4, 124, 126, 0, 0, 16, 15, 10, 8, 10, 4, 124, 128, 0, 0, 16, 13, 10, 8, 10, 4, 124, 147, 128, 0, 16, 17, 10, 8, 10, 4, 124, 150, 137, 0, 16, 24, 10, 8, 10, 4, 124, 151, 0, 0, 16, 16, 10, 8, 10, 4, 124, 152, 0, 0, 16, 16, 10, 8, 10, 4, 124, 156, 0, 0, 16, 16, 10, 8, 10, 4, 124, 160, 0, 0, 16, 16, 10, 8, 10, 4, 124, 161, 0, 0, 16, 16, 10, 8, 10, 4, 124, 162, 0, 0, 16, 16, 10, 8, 10, 4, 124, 163, 0, 0, 16, 16, 10, 8, 10, 4, 124, 164, 0, 0, 16, 14, 10, 8, 10, 4, 124, 172, 0, 0, 16, 15, 10, 8, 10, 4, 124, 174, 0, 0, 16, 15, 10, 8, 10, 4, 124, 192, 0, 0, 16, 15, 10, 8, 10, 4, 124, 196, 0, 0, 16, 16, 10, 8, 10, 4, 124, 200, 0, 0, 16, 13, 10, 8, 10, 4, 124, 220, 0, 0, 16, 14, 10, 8, 10, 4, 124, 224, 0, 0, 16, 16, 10, 8, 10, 4, 124, 225, 0, 0, 16, 16, 10, 8, 10, 4, 124, 226, 0, 0, 16, 15, 10, 8, 10, 4, 124, 228, 0, 0, 16, 14, 10, 8, 10, 4, 124, 232, 0, 0, 16, 15, 10, 8, 10, 4, 124, 234, 0, 0, 16, 15, 10, 8, 10, 4, 124, 236, 0, 0, 16, 14, 10, 8, 10, 4, 124, 240, 0, 0, 16, 17, 10, 8, 10, 4, 124, 240, 128, 0, 16, 18, 10, 8, 10, 4, 124, 242, 0, 0, 16, 16, 10, 8, 10, 4, 124, 243, 192, 0, 16, 18, 10, 8, 10, 4, 124, 248, 0, 0, 16, 17, 10, 8, 10, 4, 124, 249, 0, 0, 16, 16, 10, 8, 10, 4, 124, 250, 0, 0, 16, 15, 10, 8, 10, 4, 124, 254, 0, 0, 16, 18, 10, 8, 10, 4, 125, 31, 192, 0, 16, 18, 10, 8, 10, 4, 125, 32, 0, 0, 16, 16, 10, 8, 10, 4, 125, 33, 0, 0, 16, 16, 10, 8, 10, 4, 125, 34, 0, 0, 16, 16, 10, 8, 10, 4, 125, 35, 0, 0, 16, 17, 10, 8, 10, 4, 125, 35, 128, 0, 16, 17, 10, 8, 10, 4, 125, 36, 0, 0, 16, 14, 10, 8, 10, 4, 125, 40, 0, 0, 16, 13, 10, 8, 10, 4, 125, 58, 128, 0, 16, 17, 10, 8, 10, 4, 125, 61, 128, 0, 16, 17, 10, 8, 10, 4, 125, 62, 0, 0, 16, 18, 10, 8, 10, 4, 125, 64, 0, 0, 16, 13, 10, 8, 10, 4, 125, 72, 0, 0, 16, 16, 10, 8, 10, 4, 125, 73, 0, 0, 16, 16, 10, 8, 10, 4, 125, 74, 0, 0, 16, 15, 10, 8, 10, 4, 125, 76, 0, 0, 16, 17, 10, 8, 10, 4, 125, 76, 128, 0, 16, 17, 10, 8, 10, 4, 125, 77, 0, 0, 16, 16, 10, 8, 10, 4, 125, 78, 0, 0, 16, 15, 10, 8, 10, 4, 125, 80, 0, 0, 16, 13, 10, 8, 10, 4, 125, 88, 0, 0, 16, 13, 10, 8, 10, 4, 125, 96, 0, 0, 16, 15, 10, 8, 10, 4, 125, 98, 0, 0, 16, 16, 10, 8, 10, 4, 125, 104, 0, 0, 16, 13, 10, 8, 10, 4, 125, 112, 0, 0, 16, 12, 10, 8, 10, 4, 125, 169, 0, 0, 16, 16, 10, 8, 10, 4, 125, 171, 0, 0, 16, 16, 10, 8, 10, 4, 125, 208, 0, 0, 16, 18, 10, 8, 10, 4, 125, 210, 0, 0, 16, 16, 10, 8, 10, 4, 125, 211, 0, 0, 16, 16, 10, 8, 10, 4, 125, 213, 0, 0, 16, 17, 10, 8, 10, 4, 125, 214, 96, 0, 16, 19, 10, 8, 10, 4, 125, 215, 0, 0, 16, 18, 10, 8, 10, 4, 125, 216, 0, 0, 16, 15, 10, 8, 10, 4, 125, 218, 0, 0, 16, 16, 10, 8, 10, 4, 125, 219, 0, 0, 16, 16, 10, 8, 10, 4, 125, 220, 0, 0, 16, 15, 10, 8, 10, 4, 125, 222, 0, 0, 16, 15, 10, 8, 10, 4, 125, 254, 128, 0, 16, 18, 10, 8, 10, 4, 125, 254, 192, 0, 16, 18, 10, 8, 10, 4, 129, 28, 0, 0, 16, 16, 10, 8, 10, 4, 137, 59, 59, 0, 16, 24, 10, 8, 10, 4, 137, 59, 88, 0, 16, 22, 10, 8, 10, 4, 139, 5, 56, 0, 16, 22, 10, 8, 10, 4, 139, 5, 60, 0, 16, 22, 10, 8, 10, 4, 139, 5, 80, 0, 16, 22, 10, 8, 10, 4, 139, 5, 92, 0, 16, 22, 10, 8, 10, 4, 139, 5, 108, 0, 16, 22, 10, 8, 10, 4, 139, 5, 128, 0, 16, 22, 10, 8, 10, 4, 139, 5, 160, 0, 16, 22, 10, 8, 10, 4, 139, 5, 192, 0, 16, 22, 10, 8, 10, 4, 139, 5, 204, 0, 16, 22, 10, 8, 10, 4, 139, 5, 208, 0, 16, 22, 10, 8, 10, 4, 139, 5, 212, 0, 16, 22, 10, 8, 10, 4, 139, 5, 244, 0, 16, 22, 10, 8, 10, 4, 139, 9, 0, 0, 16, 16, 10, 8, 10, 4, 139, 129, 0, 0, 16, 16, 10, 8, 10, 4, 139, 148, 0, 0, 16, 16, 10, 8, 10, 4, 139, 155, 0, 0, 16, 16, 10, 8, 10, 4, 139, 159, 0, 0, 16, 16, 10, 8, 10, 4, 139, 170, 0, 0, 16, 16, 10, 8, 10, 4, 139, 176, 0, 0, 16, 16, 10, 8, 10, 4, 139, 183, 0, 0, 16, 16, 10, 8, 10, 4, 139, 186, 0, 0, 16, 16, 10, 8, 10, 4, 139, 189, 0, 0, 16, 16, 10, 8, 10, 4, 139, 196, 0, 0, 16, 14, 10, 8, 10, 4, 139, 200, 0, 0, 16, 13, 10, 8, 10, 4, 139, 208, 0, 0, 16, 13, 10, 8, 10, 4, 139, 217, 0, 0, 16, 16, 10, 8, 10, 4, 139, 219, 0, 0, 16, 16, 10, 8, 10, 4, 139, 220, 0, 0, 16, 15, 10, 8, 10, 4, 139, 224, 0, 0, 16, 16, 10, 8, 10, 4, 139, 226, 0, 0, 16, 15, 10, 8, 10, 4, 140, 75, 0, 0, 16, 16, 10, 8, 10, 4, 140, 143, 0, 0, 16, 16, 10, 8, 10, 4, 140, 205, 0, 0, 16, 16, 10, 8, 10, 4, 140, 206, 0, 0, 16, 15, 10, 8, 10, 4, 140, 210, 0, 0, 16, 16, 10, 8, 10, 4, 140, 224, 0, 0, 16, 16, 10, 8, 10, 4, 140, 237, 0, 0, 16, 16, 10, 8, 10, 4, 140, 240, 0, 0, 16, 16, 10, 8, 10, 4, 140, 243, 0, 0, 16, 16, 10, 8, 10, 4, 140, 246, 0, 0, 16, 16, 10, 8, 10, 4, 140, 249, 0, 0, 16, 16, 10, 8, 10, 4, 140, 250, 0, 0, 16, 16, 10, 8, 10, 4, 140, 255, 0, 0, 16, 16, 10, 8, 10, 4, 144, 0, 0, 0, 16, 16, 10, 8, 10, 4, 144, 7, 0, 0, 16, 16, 10, 8, 10, 4, 144, 12, 0, 0, 16, 16, 10, 8, 10, 4, 144, 48, 8, 0, 16, 22, 10, 8, 10, 4, 144, 48, 12, 0, 16, 22, 10, 8, 10, 4, 144, 48, 56, 0, 16, 22, 10, 8, 10, 4, 144, 48, 64, 0, 16, 22, 10, 8, 10, 4, 144, 48, 88, 0, 16, 22, 10, 8, 10, 4, 144, 48, 156, 0, 16, 22, 10, 8, 10, 4, 144, 48, 172, 0, 16, 22, 10, 8, 10, 4, 144, 48, 180, 0, 16, 22, 10, 8, 10, 4, 144, 48, 184, 0, 16, 22, 10, 8, 10, 4, 144, 48, 204, 0, 16, 22, 10, 8, 10, 4, 144, 48, 208, 0, 16, 22, 10, 8, 10, 4, 144, 48, 212, 0, 16, 22, 10, 8, 10, 4, 144, 48, 220, 0, 16, 22, 10, 8, 10, 4, 144, 48, 252, 0, 16, 22, 10, 8, 10, 4, 144, 52, 0, 0, 16, 16, 10, 8, 10, 4, 144, 123, 0, 0, 16, 16, 10, 8, 10, 4, 144, 255, 0, 0, 16, 16, 10, 8, 10, 4, 146, 196, 56, 0, 16, 22, 10, 8, 10, 4, 146, 196, 68, 0, 16, 22, 10, 8, 10, 4, 146, 196, 72, 0, 16, 22, 10, 8, 10, 4, 146, 196, 76, 0, 16, 22, 10, 8, 10, 4, 146, 196, 92, 0, 16, 22, 10, 8, 10, 4, 146, 196, 112, 0, 16, 22, 10, 8, 10, 4, 146, 196, 116, 0, 16, 22, 10, 8, 10, 4, 146, 196, 124, 0, 16, 22, 10, 8, 10, 4, 150, 0, 0, 0, 16, 16, 10, 8, 10, 4, 150, 115, 0, 0, 16, 16, 10, 8, 10, 4, 150, 121, 0, 0, 16, 16, 10, 8, 10, 4, 150, 122, 0, 0, 16, 16, 10, 8, 10, 4, 150, 129, 136, 0, 16, 22, 10, 8, 10, 4, 150, 129, 152, 0, 16, 22, 10, 8, 10, 4, 150, 129, 192, 0, 16, 22, 10, 8, 10, 4, 150, 129, 216, 0, 16, 22, 10, 8, 10, 4, 150, 129, 252, 0, 16, 22, 10, 8, 10, 4, 150, 138, 0, 0, 16, 15, 10, 8, 10, 4, 150, 223, 0, 0, 16, 16, 10, 8, 10, 4, 150, 242, 0, 0, 16, 22, 10, 8, 10, 4, 150, 242, 4, 0, 16, 22, 10, 8, 10, 4, 150, 242, 8, 0, 16, 22, 10, 8, 10, 4, 150, 242, 28, 0, 16, 22, 10, 8, 10, 4, 150, 242, 44, 0, 16, 22, 10, 8, 10, 4, 150, 242, 48, 0, 16, 22, 10, 8, 10, 4, 150, 242, 52, 0, 16, 22, 10, 8, 10, 4, 150, 242, 56, 0, 16, 22, 10, 8, 10, 4, 150, 242, 76, 0, 16, 22, 10, 8, 10, 4, 150, 242, 80, 0, 16, 22, 10, 8, 10, 4, 150, 242, 92, 0, 16, 22, 10, 8, 10, 4, 150, 242, 96, 0, 16, 22, 10, 8, 10, 4, 150, 242, 112, 0, 16, 22, 10, 8, 10, 4, 150, 242, 116, 0, 16, 22, 10, 8, 10, 4, 150, 242, 120, 0, 16, 22, 10, 8, 10, 4, 150, 242, 152, 0, 16, 22, 10, 8, 10, 4, 150, 242, 156, 0, 16, 22, 10, 8, 10, 4, 150, 242, 160, 0, 16, 22, 10, 8, 10, 4, 150, 242, 164, 0, 16, 22, 10, 8, 10, 4, 150, 242, 168, 0, 16, 22, 10, 8, 10, 4, 150, 242, 184, 0, 16, 22, 10, 8, 10, 4, 150, 242, 188, 0, 16, 22, 10, 8, 10, 4, 150, 242, 192, 0, 16, 22, 10, 8, 10, 4, 150, 242, 212, 0, 16, 22, 10, 8, 10, 4, 150, 242, 224, 0, 16, 22, 10, 8, 10, 4, 150, 242, 228, 0, 16, 22, 10, 8, 10, 4, 150, 242, 232, 0, 16, 22, 10, 8, 10, 4, 150, 242, 236, 0, 16, 22, 10, 8, 10, 4, 150, 242, 240, 0, 16, 22, 10, 8, 10, 4, 150, 242, 244, 0, 16, 22, 10, 8, 10, 4, 150, 242, 248, 0, 16, 22, 10, 8, 10, 4, 150, 255, 0, 0, 16, 16, 10, 8, 10, 4, 152, 104, 128, 0, 16, 17, 10, 8, 10, 4, 153, 0, 0, 0, 16, 16, 10, 8, 10, 4, 153, 3, 0, 0, 16, 16, 10, 8, 10, 4, 153, 34, 0, 0, 16, 15, 10, 8, 10, 4, 153, 36, 0, 0, 16, 15, 10, 8, 10, 4, 153, 99, 0, 0, 16, 16, 10, 8, 10, 4, 153, 101, 0, 0, 16, 16, 10, 8, 10, 4, 153, 118, 0, 0, 16, 15, 10, 8, 10, 4, 154, 8, 128, 0, 16, 17, 10, 8, 10, 4, 157, 0, 0, 0, 16, 16, 10, 8, 10, 4, 157, 18, 0, 0, 16, 16, 10, 8, 10, 4, 157, 61, 0, 0, 16, 16, 10, 8, 10, 4, 157, 119, 0, 0, 16, 22, 10, 8, 10, 4, 157, 119, 8, 0, 16, 22, 10, 8, 10, 4, 157, 119, 12, 0, 16, 22, 10, 8, 10, 4, 157, 119, 16, 0, 16, 22, 10, 8, 10, 4, 157, 119, 28, 0, 16, 22, 10, 8, 10, 4, 157, 119, 68, 0, 16, 22, 10, 8, 10, 4, 157, 119, 112, 0, 16, 22, 10, 8, 10, 4, 157, 119, 132, 0, 16, 22, 10, 8, 10, 4, 157, 119, 136, 0, 16, 22, 10, 8, 10, 4, 157, 119, 140, 0, 16, 22, 10, 8, 10, 4, 157, 119, 144, 0, 16, 22, 10, 8, 10, 4, 157, 119, 148, 0, 16, 22, 10, 8, 10, 4, 157, 119, 152, 0, 16, 22, 10, 8, 10, 4, 157, 119, 156, 0, 16, 22, 10, 8, 10, 4, 157, 119, 160, 0, 16, 22, 10, 8, 10, 4, 157, 119, 164, 0, 16, 22, 10, 8, 10, 4, 157, 119, 172, 0, 16, 22, 10, 8, 10, 4, 157, 119, 192, 0, 16, 22, 10, 8, 10, 4, 157, 119, 196, 0, 16, 22, 10, 8, 10, 4, 157, 119, 240, 0, 16, 22, 10, 8, 10, 4, 157, 119, 252, 0, 16, 22, 10, 8, 10, 4, 157, 122, 0, 0, 16, 16, 10, 8, 10, 4, 157, 148, 0, 0, 16, 16, 10, 8, 10, 4, 157, 156, 0, 0, 16, 16, 10, 8, 10, 4, 157, 255, 0, 0, 16, 16, 10, 8, 10, 4, 159, 226, 0, 0, 16, 16, 10, 8, 10, 4, 160, 19, 48, 0, 16, 22, 10, 8, 10, 4, 160, 19, 208, 0, 16, 22, 10, 8, 10, 4, 160, 19, 212, 0, 16, 22, 10, 8, 10, 4, 160, 19, 216, 0, 16, 22, 10, 8, 10, 4, 160, 20, 48, 0, 16, 22, 10, 8, 10, 4, 160, 202, 60, 0, 16, 22, 10, 8, 10, 4, 160, 202, 148, 0, 16, 22, 10, 8, 10, 4, 160, 202, 152, 0, 16, 22, 10, 8, 10, 4, 160, 202, 168, 0, 16, 22, 10, 8, 10, 4, 160, 202, 212, 0, 16, 22, 10, 8, 10, 4, 160, 202, 216, 0, 16, 22, 10, 8, 10, 4, 160, 202, 220, 0, 16, 22, 10, 8, 10, 4, 160, 202, 224, 0, 16, 22, 10, 8, 10, 4, 160, 202, 228, 0, 16, 22, 10, 8, 10, 4, 160, 202, 232, 0, 16, 22, 10, 8, 10, 4, 160, 202, 236, 0, 16, 22, 10, 8, 10, 4, 160, 202, 240, 0, 16, 22, 10, 8, 10, 4, 160, 202, 244, 0, 16, 22, 10, 8, 10, 4, 160, 202, 248, 0, 16, 22, 10, 8, 10, 4, 160, 202, 252, 0, 16, 22, 10, 8, 10, 4, 160, 238, 64, 0, 16, 22, 10, 8, 10, 4, 161, 207, 0, 0, 16, 16, 10, 8, 10, 4, 162, 105, 0, 0, 16, 16, 10, 8, 10, 4, 163, 0, 0, 0, 16, 16, 10, 8, 10, 4, 163, 47, 4, 0, 16, 22, 10, 8, 10, 4, 163, 53, 0, 0, 16, 22, 10, 8, 10, 4, 163, 53, 4, 0, 16, 22, 10, 8, 10, 4, 163, 53, 8, 0, 16, 22, 10, 8, 10, 4, 163, 53, 12, 0, 16, 22, 10, 8, 10, 4, 163, 53, 36, 0, 16, 22, 10, 8, 10, 4, 163, 53, 40, 0, 16, 22, 10, 8, 10, 4, 163, 53, 44, 0, 16, 22, 10, 8, 10, 4, 163, 53, 48, 0, 16, 22, 10, 8, 10, 4, 163, 53, 52, 0, 16, 22, 10, 8, 10, 4, 163, 53, 56, 0, 16, 22, 10, 8, 10, 4, 163, 53, 60, 0, 16, 22, 10, 8, 10, 4, 163, 53, 64, 0, 16, 22, 10, 8, 10, 4, 163, 53, 88, 0, 16, 22, 10, 8, 10, 4, 163, 53, 92, 0, 16, 22, 10, 8, 10, 4, 163, 53, 96, 0, 16, 22, 10, 8, 10, 4, 163, 53, 100, 0, 16, 22, 10, 8, 10, 4, 163, 53, 104, 0, 16, 22, 10, 8, 10, 4, 163, 53, 108, 0, 16, 22, 10, 8, 10, 4, 163, 53, 112, 0, 16, 22, 10, 8, 10, 4, 163, 53, 116, 0, 16, 22, 10, 8, 10, 4, 163, 53, 120, 0, 16, 22, 10, 8, 10, 4, 163, 53, 124, 0, 16, 22, 10, 8, 10, 4, 163, 53, 128, 0, 16, 22, 10, 8, 10, 4, 163, 53, 132, 0, 16, 22, 10, 8, 10, 4, 163, 53, 136, 0, 16, 22, 10, 8, 10, 4, 163, 53, 160, 0, 16, 22, 10, 8, 10, 4, 163, 53, 164, 0, 16, 22, 10, 8, 10, 4, 163, 53, 168, 0, 16, 22, 10, 8, 10, 4, 163, 53, 172, 0, 16, 22, 10, 8, 10, 4, 163, 53, 188, 0, 16, 22, 10, 8, 10, 4, 163, 53, 220, 0, 16, 22, 10, 8, 10, 4, 163, 53, 236, 0, 16, 22, 10, 8, 10, 4, 163, 53, 240, 0, 16, 22, 10, 8, 10, 4, 163, 125, 0, 0, 16, 16, 10, 8, 10, 4, 163, 142, 0, 0, 16, 16, 10, 8, 10, 4, 163, 177, 0, 0, 16, 16, 10, 8, 10, 4, 163, 179, 0, 0, 16, 16, 10, 8, 10, 4, 163, 204, 0, 0, 16, 16, 10, 8, 10, 4, 164, 52, 0, 0, 16, 17, 10, 8, 10, 4, 166, 111, 0, 0, 16, 16, 10, 8, 10, 4, 167, 139, 0, 0, 16, 16, 10, 8, 10, 4, 167, 189, 0, 0, 16, 16, 10, 8, 10, 4, 167, 220, 244, 0, 16, 22, 10, 8, 10, 4, 168, 160, 0, 0, 16, 16, 10, 8, 10, 4, 170, 179, 0, 0, 16, 16, 10, 8, 10, 4, 171, 8, 0, 0, 16, 13, 10, 8, 10, 4, 171, 34, 0, 0, 16, 15, 10, 8, 10, 4, 171, 36, 0, 0, 16, 14, 10, 8, 10, 4, 171, 40, 0, 0, 16, 13, 10, 8, 10, 4, 171, 80, 0, 0, 16, 14, 10, 8, 10, 4, 171, 84, 0, 0, 16, 14, 10, 8, 10, 4, 171, 88, 0, 0, 16, 13, 10, 8, 10, 4, 171, 104, 0, 0, 16, 13, 10, 8, 10, 4, 171, 112, 0, 0, 16, 14, 10, 8, 10, 4, 171, 116, 0, 0, 16, 14, 10, 8, 10, 4, 171, 120, 0, 0, 16, 13, 10, 8, 10, 4, 171, 208, 0, 0, 16, 12, 10, 8, 10, 4, 172, 81, 192, 0, 16, 18, 10, 8, 10, 4, 175, 0, 0, 0, 16, 12, 10, 8, 10, 4, 175, 16, 0, 0, 16, 13, 10, 8, 10, 4, 175, 24, 0, 0, 16, 14, 10, 8, 10, 4, 175, 30, 0, 0, 16, 15, 10, 8, 10, 4, 175, 42, 0, 0, 16, 15, 10, 8, 10, 4, 175, 44, 0, 0, 16, 16, 10, 8, 10, 4, 175, 46, 0, 0, 16, 15, 10, 8, 10, 4, 175, 48, 0, 0, 16, 12, 10, 8, 10, 4, 175, 64, 0, 0, 16, 11, 10, 8, 10, 4, 175, 102, 0, 0, 16, 16, 10, 8, 10, 4, 175, 106, 128, 0, 16, 17, 10, 8, 10, 4, 175, 111, 108, 0, 16, 22, 10, 8, 10, 4, 175, 111, 144, 0, 16, 22, 10, 8, 10, 4, 175, 111, 148, 0, 16, 22, 10, 8, 10, 4, 175, 111, 152, 0, 16, 22, 10, 8, 10, 4, 175, 111, 156, 0, 16, 22, 10, 8, 10, 4, 175, 111, 160, 0, 16, 22, 10, 8, 10, 4, 175, 111, 164, 0, 16, 22, 10, 8, 10, 4, 175, 111, 168, 0, 16, 22, 10, 8, 10, 4, 175, 111, 172, 0, 16, 22, 10, 8, 10, 4, 175, 111, 184, 0, 16, 22, 10, 8, 10, 4, 175, 146, 0, 0, 16, 15, 10, 8, 10, 4, 175, 148, 0, 0, 16, 14, 10, 8, 10, 4, 175, 152, 0, 0, 16, 14, 10, 8, 10, 4, 175, 158, 96, 0, 16, 22, 10, 8, 10, 4, 175, 160, 0, 0, 16, 12, 10, 8, 10, 4, 175, 176, 156, 0, 16, 22, 10, 8, 10, 4, 175, 176, 176, 0, 16, 22, 10, 8, 10, 4, 175, 176, 188, 0, 16, 22, 10, 8, 10, 4, 175, 178, 0, 0, 16, 16, 10, 8, 10, 4, 175, 184, 128, 0, 16, 18, 10, 8, 10, 4, 175, 185, 0, 0, 16, 16, 10, 8, 10, 4, 175, 186, 0, 0, 16, 15, 10, 8, 10, 4, 175, 188, 0, 0, 16, 14, 10, 8, 10, 4, 180, 76, 0, 0, 16, 16, 10, 8, 10, 4, 180, 77, 0, 0, 16, 16, 10, 8, 10, 4, 180, 78, 0, 0, 16, 15, 10, 8, 10, 4, 180, 84, 0, 0, 16, 15, 10, 8, 10, 4, 180, 86, 0, 0, 16, 16, 10, 8, 10, 4, 180, 88, 0, 0, 16, 14, 10, 8, 10, 4, 180, 94, 56, 0, 16, 21, 10, 8, 10, 4, 180, 94, 96, 0, 16, 20, 10, 8, 10, 4, 180, 94, 120, 0, 16, 22, 10, 8, 10, 4, 180, 94, 124, 0, 16, 22, 10, 8, 10, 4, 180, 95, 128, 0, 16, 17, 10, 8, 10, 4, 180, 96, 0, 0, 16, 11, 10, 8, 10, 4, 180, 129, 128, 0, 16, 17, 10, 8, 10, 4, 180, 130, 0, 0, 16, 16, 10, 8, 10, 4, 180, 136, 0, 0, 16, 13, 10, 8, 10, 4, 180, 148, 16, 0, 16, 21, 10, 8, 10, 4, 180, 148, 152, 0, 16, 21, 10, 8, 10, 4, 180, 148, 216, 0, 16, 21, 10, 8, 10, 4, 180, 148, 224, 0, 16, 19, 10, 8, 10, 4, 180, 149, 128, 0, 16, 19, 10, 8, 10, 4, 180, 149, 236, 0, 16, 22, 10, 8, 10, 4, 180, 150, 160, 0, 16, 19, 10, 8, 10, 4, 180, 152, 0, 0, 16, 13, 10, 8, 10, 4, 180, 160, 0, 0, 16, 12, 10, 8, 10, 4, 180, 178, 112, 0, 16, 22, 10, 8, 10, 4, 180, 178, 116, 0, 16, 22, 10, 8, 10, 4, 180, 178, 192, 0, 16, 18, 10, 8, 10, 4, 180, 184, 0, 0, 16, 14, 10, 8, 10, 4, 180, 188, 0, 0, 16, 17, 10, 8, 10, 4, 180, 189, 148, 0, 16, 22, 10, 8, 10, 4, 180, 200, 252, 0, 16, 22, 10, 8, 10, 4, 180, 201, 0, 0, 16, 16, 10, 8, 10, 4, 180, 202, 0, 0, 16, 15, 10, 8, 10, 4, 180, 208, 0, 0, 16, 15, 10, 8, 10, 4, 180, 210, 212, 0, 16, 22, 10, 8, 10, 4, 180, 210, 224, 0, 16, 19, 10, 8, 10, 4, 180, 212, 0, 0, 16, 15, 10, 8, 10, 4, 180, 222, 224, 0, 16, 19, 10, 8, 10, 4, 180, 223, 0, 0, 16, 16, 10, 8, 10, 4, 180, 233, 0, 0, 16, 18, 10, 8, 10, 4, 180, 233, 64, 0, 16, 19, 10, 8, 10, 4, 180, 233, 144, 0, 16, 22, 10, 8, 10, 4, 180, 235, 64, 0, 16, 19, 10, 8, 10, 4, 180, 235, 112, 0, 16, 22, 10, 8, 10, 4, 180, 235, 136, 0, 16, 22, 10, 8, 10, 4, 182, 16, 144, 0, 16, 22, 10, 8, 10, 4, 182, 16, 148, 0, 16, 22, 10, 8, 10, 4, 182, 16, 192, 0, 16, 19, 10, 8, 10, 4, 182, 18, 0, 0, 16, 17, 10, 8, 10, 4, 182, 23, 184, 0, 16, 21, 10, 8, 10, 4, 182, 23, 200, 0, 16, 21, 10, 8, 10, 4, 182, 32, 0, 0, 16, 12, 10, 8, 10, 4, 182, 48, 96, 0, 16, 19, 10, 8, 10, 4, 182, 49, 0, 0, 16, 16, 10, 8, 10, 4, 182, 50, 0, 0, 16, 20, 10, 8, 10, 4, 182, 50, 112, 0, 16, 20, 10, 8, 10, 4, 182, 51, 0, 0, 16, 16, 10, 8, 10, 4, 182, 54, 0, 0, 16, 17, 10, 8, 10, 4, 182, 54, 244, 0, 16, 22, 10, 8, 10, 4, 182, 61, 0, 0, 16, 16, 10, 8, 10, 4, 182, 80, 0, 0, 16, 14, 10, 8, 10, 4, 182, 84, 0, 0, 16, 14, 10, 8, 10, 4, 182, 88, 0, 0, 16, 14, 10, 8, 10, 4, 182, 92, 0, 0, 16, 16, 10, 8, 10, 4, 182, 96, 0, 0, 16, 12, 10, 8, 10, 4, 182, 112, 0, 0, 16, 12, 10, 8, 10, 4, 182, 128, 0, 0, 16, 12, 10, 8, 10, 4, 182, 144, 0, 0, 16, 13, 10, 8, 10, 4, 182, 157, 0, 0, 16, 16, 10, 8, 10, 4, 182, 160, 64, 0, 16, 19, 10, 8, 10, 4, 182, 174, 0, 0, 16, 15, 10, 8, 10, 4, 182, 200, 0, 0, 16, 13, 10, 8, 10, 4, 182, 236, 128, 0, 16, 17, 10, 8, 10, 4, 182, 237, 24, 0, 16, 22, 10, 8, 10, 4, 182, 237, 28, 0, 16, 22, 10, 8, 10, 4, 182, 238, 0, 0, 16, 16, 10, 8, 10, 4, 182, 239, 0, 0, 16, 19, 10, 8, 10, 4, 182, 240, 0, 0, 16, 13, 10, 8, 10, 4, 182, 254, 0, 0, 16, 16, 10, 8, 10, 4, 182, 255, 36, 0, 16, 22, 10, 8, 10, 4, 182, 255, 60, 0, 16, 22, 10, 8, 10, 4, 183, 0, 0, 0, 16, 10, 10, 8, 10, 4, 183, 64, 0, 0, 16, 13, 10, 8, 10, 4, 183, 78, 160, 0, 16, 22, 10, 8, 10, 4, 183, 78, 164, 0, 16, 22, 10, 8, 10, 4, 183, 78, 180, 0, 16, 22, 10, 8, 10, 4, 183, 81, 172, 0, 16, 22, 10, 8, 10, 4, 183, 81, 180, 0, 16, 22, 10, 8, 10, 4, 183, 84, 0, 0, 16, 15, 10, 8, 10, 4, 183, 91, 128, 0, 16, 22, 10, 8, 10, 4, 183, 91, 136, 0, 16, 21, 10, 8, 10, 4, 183, 91, 144, 0, 16, 20, 10, 8, 10, 4, 183, 92, 0, 0, 16, 14, 10, 8, 10, 4, 183, 128, 0, 0, 16, 11, 10, 8, 10, 4, 183, 160, 0, 0, 16, 13, 10, 8, 10, 4, 183, 168, 0, 0, 16, 15, 10, 8, 10, 4, 183, 170, 0, 0, 16, 16, 10, 8, 10, 4, 183, 172, 0, 0, 16, 14, 10, 8, 10, 4, 183, 182, 0, 0, 16, 19, 10, 8, 10, 4, 183, 184, 0, 0, 16, 13, 10, 8, 10, 4, 183, 192, 0, 0, 16, 10, 10, 8, 10, 4, 188, 131, 128, 0, 16, 17, 10, 8, 10, 4, 192, 124, 154, 0, 16, 24, 10, 8, 10, 4, 192, 140, 128, 0, 16, 22, 10, 8, 10, 4, 192, 140, 132, 0, 16, 22, 10, 8, 10, 4, 192, 140, 136, 0, 16, 22, 10, 8, 10, 4, 192, 140, 156, 0, 16, 22, 10, 8, 10, 4, 192, 140, 160, 0, 16, 22, 10, 8, 10, 4, 192, 140, 164, 0, 16, 22, 10, 8, 10, 4, 192, 140, 168, 0, 16, 22, 10, 8, 10, 4, 192, 140, 172, 0, 16, 22, 10, 8, 10, 4, 192, 140, 176, 0, 16, 22, 10, 8, 10, 4, 192, 140, 180, 0, 16, 22, 10, 8, 10, 4, 192, 140, 184, 0, 16, 22, 10, 8, 10, 4, 192, 140, 188, 0, 16, 22, 10, 8, 10, 4, 192, 140, 192, 0, 16, 22, 10, 8, 10, 4, 192, 140, 196, 0, 16, 22, 10, 8, 10, 4, 192, 140, 200, 0, 16, 22, 10, 8, 10, 4, 192, 140, 204, 0, 16, 22, 10, 8, 10, 4, 192, 140, 208, 0, 16, 22, 10, 8, 10, 4, 192, 140, 212, 0, 16, 22, 10, 8, 10, 4, 192, 144, 128, 0, 16, 17, 10, 8, 10, 4, 193, 112, 0, 0, 16, 16, 10, 8, 10, 4, 202, 0, 100, 0, 16, 23, 10, 8, 10, 4, 202, 0, 122, 0, 16, 23, 10, 8, 10, 4, 202, 0, 176, 0, 16, 22, 10, 8, 10, 4, 202, 3, 128, 0, 16, 23, 10, 8, 10, 4, 202, 4, 128, 0, 16, 19, 10, 8, 10, 4, 202, 4, 252, 0, 16, 22, 10, 8, 10, 4, 202, 5, 208, 0, 16, 22, 10, 8, 10, 4, 202, 5, 212, 0, 16, 22, 10, 8, 10, 4, 202, 5, 216, 0, 16, 22, 10, 8, 10, 4, 202, 6, 6, 0, 16, 23, 10, 8, 10, 4, 202, 6, 66, 0, 16, 23, 10, 8, 10, 4, 202, 6, 72, 0, 16, 23, 10, 8, 10, 4, 202, 6, 87, 0, 16, 24, 10, 8, 10, 4, 202, 6, 88, 0, 16, 23, 10, 8, 10, 4, 202, 6, 92, 0, 16, 23, 10, 8, 10, 4, 202, 6, 103, 0, 16, 24, 10, 8, 10, 4, 202, 6, 108, 0, 16, 24, 10, 8, 10, 4, 202, 6, 110, 0, 16, 23, 10, 8, 10, 4, 202, 6, 114, 0, 16, 24, 10, 8, 10, 4, 202, 6, 176, 0, 16, 20, 10, 8, 10, 4, 202, 8, 0, 0, 16, 24, 10, 8, 10, 4, 202, 8, 2, 0, 16, 23, 10, 8, 10, 4, 202, 8, 4, 0, 16, 23, 10, 8, 10, 4, 202, 8, 12, 0, 16, 24, 10, 8, 10, 4, 202, 8, 24, 0, 16, 24, 10, 8, 10, 4, 202, 8, 77, 0, 16, 24, 10, 8, 10, 4, 202, 8, 128, 0, 16, 19, 10, 8, 10, 4, 202, 8, 192, 0, 16, 20, 10, 8, 10, 4, 202, 9, 32, 0, 16, 24, 10, 8, 10, 4, 202, 9, 34, 0, 16, 23, 10, 8, 10, 4, 202, 9, 48, 0, 16, 23, 10, 8, 10, 4, 202, 9, 51, 0, 16, 24, 10, 8, 10, 4, 202, 9, 52, 0, 16, 23, 10, 8, 10, 4, 202, 9, 54, 0, 16, 24, 10, 8, 10, 4, 202, 9, 57, 0, 16, 24, 10, 8, 10, 4, 202, 9, 58, 0, 16, 23, 10, 8, 10, 4, 202, 10, 64, 0, 16, 20, 10, 8, 10, 4, 202, 10, 112, 0, 16, 22, 10, 8, 10, 4, 202, 10, 116, 0, 16, 22, 10, 8, 10, 4, 202, 10, 120, 0, 16, 22, 10, 8, 10, 4, 202, 10, 124, 0, 16, 22, 10, 8, 10, 4, 202, 12, 1, 0, 16, 24, 10, 8, 10, 4, 202, 12, 2, 0, 16, 24, 10, 8, 10, 4, 202, 12, 17, 0, 16, 24, 10, 8, 10, 4, 202, 12, 18, 0, 16, 24, 10, 8, 10, 4, 202, 12, 19, 0, 16, 24, 10, 8, 10, 4, 202, 12, 72, 0, 16, 24, 10, 8, 10, 4, 202, 12, 84, 0, 16, 23, 10, 8, 10, 4, 202, 12, 96, 0, 16, 24, 10, 8, 10, 4, 202, 12, 98, 0, 16, 23, 10, 8, 10, 4, 202, 12, 106, 0, 16, 24, 10, 8, 10, 4, 202, 12, 111, 0, 16, 24, 10, 8, 10, 4, 202, 12, 116, 0, 16, 24, 10, 8, 10, 4, 202, 14, 64, 0, 16, 23, 10, 8, 10, 4, 202, 14, 69, 0, 16, 24, 10, 8, 10, 4, 202, 14, 73, 0, 16, 24, 10, 8, 10, 4, 202, 14, 74, 0, 16, 23, 10, 8, 10, 4, 202, 14, 76, 0, 16, 24, 10, 8, 10, 4, 202, 14, 78, 0, 16, 23, 10, 8, 10, 4, 202, 14, 88, 0, 16, 24, 10, 8, 10, 4, 202, 14, 97, 0, 16, 24, 10, 8, 10, 4, 202, 14, 104, 0, 16, 23, 10, 8, 10, 4, 202, 14, 108, 0, 16, 23, 10, 8, 10, 4, 202, 14, 111, 0, 16, 24, 10, 8, 10, 4, 202, 14, 114, 0, 16, 23, 10, 8, 10, 4, 202, 14, 118, 0, 16, 23, 10, 8, 10, 4, 202, 14, 124, 0, 16, 23, 10, 8, 10, 4, 202, 14, 127, 0, 16, 24, 10, 8, 10, 4, 202, 14, 129, 0, 16, 24, 10, 8, 10, 4, 202, 14, 135, 0, 16, 24, 10, 8, 10, 4, 202, 14, 136, 0, 16, 24, 10, 8, 10, 4, 202, 14, 149, 0, 16, 24, 10, 8, 10, 4, 202, 14, 151, 0, 16, 24, 10, 8, 10, 4, 202, 14, 157, 0, 16, 24, 10, 8, 10, 4, 202, 14, 158, 0, 16, 23, 10, 8, 10, 4, 202, 14, 169, 0, 16, 24, 10, 8, 10, 4, 202, 14, 170, 0, 16, 23, 10, 8, 10, 4, 202, 14, 172, 0, 16, 22, 10, 8, 10, 4, 202, 14, 176, 0, 16, 24, 10, 8, 10, 4, 202, 14, 184, 0, 16, 23, 10, 8, 10, 4, 202, 14, 208, 0, 16, 23, 10, 8, 10, 4, 202, 14, 213, 0, 16, 24, 10, 8, 10, 4, 202, 14, 219, 0, 16, 24, 10, 8, 10, 4, 202, 14, 220, 0, 16, 24, 10, 8, 10, 4, 202, 14, 222, 0, 16, 23, 10, 8, 10, 4, 202, 14, 225, 0, 16, 24, 10, 8, 10, 4, 202, 14, 226, 0, 16, 23, 10, 8, 10, 4, 202, 14, 231, 0, 16, 24, 10, 8, 10, 4, 202, 14, 235, 0, 16, 24, 10, 8, 10, 4, 202, 14, 236, 0, 16, 23, 10, 8, 10, 4, 202, 14, 238, 0, 16, 24, 10, 8, 10, 4, 202, 14, 239, 0, 16, 24, 10, 8, 10, 4, 202, 14, 246, 0, 16, 24, 10, 8, 10, 4, 202, 14, 251, 0, 16, 24, 10, 8, 10, 4, 202, 20, 66, 0, 16, 24, 10, 8, 10, 4, 202, 20, 79, 0, 16, 24, 10, 8, 10, 4, 202, 20, 87, 0, 16, 24, 10, 8, 10, 4, 202, 20, 88, 0, 16, 23, 10, 8, 10, 4, 202, 20, 90, 0, 16, 24, 10, 8, 10, 4, 202, 20, 94, 0, 16, 23, 10, 8, 10, 4, 202, 20, 114, 0, 16, 24, 10, 8, 10, 4, 202, 20, 117, 0, 16, 24, 10, 8, 10, 4, 202, 20, 120, 0, 16, 24, 10, 8, 10, 4, 202, 20, 125, 0, 16, 24, 10, 8, 10, 4, 202, 20, 126, 0, 16, 24, 10, 8, 10, 4, 202, 20, 127, 0, 16, 24, 10, 8, 10, 4, 202, 21, 48, 0, 16, 22, 10, 8, 10, 4, 202, 21, 52, 0, 16, 22, 10, 8, 10, 4, 202, 21, 56, 0, 16, 22, 10, 8, 10, 4, 202, 21, 60, 0, 16, 22, 10, 8, 10, 4, 202, 21, 131, 0, 16, 24, 10, 8, 10, 4, 202, 21, 132, 0, 16, 24, 10, 8, 10, 4, 202, 21, 141, 0, 16, 24, 10, 8, 10, 4, 202, 21, 142, 0, 16, 24, 10, 8, 10, 4, 202, 21, 147, 0, 16, 24, 10, 8, 10, 4, 202, 21, 148, 0, 16, 24, 10, 8, 10, 4, 202, 21, 150, 0, 16, 23, 10, 8, 10, 4, 202, 21, 152, 0, 16, 23, 10, 8, 10, 4, 202, 21, 154, 0, 16, 24, 10, 8, 10, 4, 202, 21, 156, 0, 16, 24, 10, 8, 10, 4, 202, 22, 248, 0, 16, 22, 10, 8, 10, 4, 202, 22, 252, 0, 16, 22, 10, 8, 10, 4, 202, 27, 12, 0, 16, 24, 10, 8, 10, 4, 202, 27, 14, 0, 16, 24, 10, 8, 10, 4, 202, 27, 136, 0, 16, 23, 10, 8, 10, 4, 202, 36, 226, 0, 16, 24, 10, 8, 10, 4, 202, 38, 0, 0, 16, 23, 10, 8, 10, 4, 202, 38, 2, 0, 16, 23, 10, 8, 10, 4, 202, 38, 8, 0, 16, 21, 10, 8, 10, 4, 202, 38, 48, 0, 16, 20, 10, 8, 10, 4, 202, 38, 64, 0, 16, 19, 10, 8, 10, 4, 202, 38, 96, 0, 16, 19, 10, 8, 10, 4, 202, 38, 128, 0, 16, 23, 10, 8, 10, 4, 202, 38, 130, 0, 16, 23, 10, 8, 10, 4, 202, 38, 132, 0, 16, 23, 10, 8, 10, 4, 202, 38, 134, 0, 16, 24, 10, 8, 10, 4, 202, 38, 135, 0, 16, 24, 10, 8, 10, 4, 202, 38, 136, 0, 16, 23, 10, 8, 10, 4, 202, 38, 138, 0, 16, 24, 10, 8, 10, 4, 202, 38, 140, 0, 16, 23, 10, 8, 10, 4, 202, 38, 142, 0, 16, 23, 10, 8, 10, 4, 202, 38, 146, 0, 16, 23, 10, 8, 10, 4, 202, 38, 149, 0, 16, 24, 10, 8, 10, 4, 202, 38, 150, 0, 16, 23, 10, 8, 10, 4, 202, 38, 152, 0, 16, 23, 10, 8, 10, 4, 202, 38, 154, 0, 16, 23, 10, 8, 10, 4, 202, 38, 156, 0, 16, 24, 10, 8, 10, 4, 202, 38, 158, 0, 16, 23, 10, 8, 10, 4, 202, 38, 160, 0, 16, 23, 10, 8, 10, 4, 202, 38, 164, 0, 16, 22, 10, 8, 10, 4, 202, 38, 168, 0, 16, 23, 10, 8, 10, 4, 202, 38, 170, 0, 16, 24, 10, 8, 10, 4, 202, 38, 171, 0, 16, 24, 10, 8, 10, 4, 202, 38, 176, 0, 16, 23, 10, 8, 10, 4, 202, 38, 184, 0, 16, 21, 10, 8, 10, 4, 202, 38, 192, 0, 16, 18, 10, 8, 10, 4, 202, 40, 4, 0, 16, 23, 10, 8, 10, 4, 202, 40, 7, 0, 16, 24, 10, 8, 10, 4, 202, 40, 15, 0, 16, 24, 10, 8, 10, 4, 202, 40, 135, 0, 16, 24, 10, 8, 10, 4, 202, 40, 136, 0, 16, 24, 10, 8, 10, 4, 202, 40, 140, 0, 16, 24, 10, 8, 10, 4, 202, 40, 143, 0, 16, 24, 10, 8, 10, 4, 202, 40, 144, 0, 16, 23, 10, 8, 10, 4, 202, 40, 150, 0, 16, 24, 10, 8, 10, 4, 202, 40, 155, 0, 16, 24, 10, 8, 10, 4, 202, 40, 156, 0, 16, 24, 10, 8, 10, 4, 202, 40, 158, 0, 16, 23, 10, 8, 10, 4, 202, 40, 162, 0, 16, 24, 10, 8, 10, 4, 202, 41, 8, 0, 16, 23, 10, 8, 10, 4, 202, 41, 11, 0, 16, 24, 10, 8, 10, 4, 202, 41, 12, 0, 16, 23, 10, 8, 10, 4, 202, 41, 128, 0, 16, 24, 10, 8, 10, 4, 202, 41, 130, 0, 16, 23, 10, 8, 10, 4, 202, 41, 152, 0, 16, 21, 10, 8, 10, 4, 202, 41, 192, 0, 16, 24, 10, 8, 10, 4, 202, 41, 196, 0, 16, 22, 10, 8, 10, 4, 202, 41, 200, 0, 16, 22, 10, 8, 10, 4, 202, 41, 240, 0, 16, 20, 10, 8, 10, 4, 202, 43, 76, 0, 16, 22, 10, 8, 10, 4, 202, 43, 144, 0, 16, 20, 10, 8, 10, 4, 202, 44, 16, 0, 16, 20, 10, 8, 10, 4, 202, 44, 48, 0, 16, 22, 10, 8, 10, 4, 202, 44, 67, 0, 16, 24, 10, 8, 10, 4, 202, 44, 74, 0, 16, 24, 10, 8, 10, 4, 202, 44, 97, 0, 16, 24, 10, 8, 10, 4, 202, 44, 129, 0, 16, 24, 10, 8, 10, 4, 202, 44, 132, 0, 16, 23, 10, 8, 10, 4, 202, 44, 146, 0, 16, 23, 10, 8, 10, 4, 202, 45, 0, 0, 16, 23, 10, 8, 10, 4, 202, 45, 2, 0, 16, 24, 10, 8, 10, 4, 202, 45, 15, 0, 16, 24, 10, 8, 10, 4, 202, 45, 16, 0, 16, 20, 10, 8, 10, 4, 202, 46, 16, 0, 16, 23, 10, 8, 10, 4, 202, 46, 18, 0, 16, 24, 10, 8, 10, 4, 202, 46, 20, 0, 16, 23, 10, 8, 10, 4, 202, 46, 32, 0, 16, 19, 10, 8, 10, 4, 202, 46, 128, 0, 16, 24, 10, 8, 10, 4, 202, 46, 224, 0, 16, 20, 10, 8, 10, 4, 202, 47, 82, 0, 16, 23, 10, 8, 10, 4, 202, 47, 96, 0, 16, 22, 10, 8, 10, 4, 202, 47, 100, 0, 16, 22, 10, 8, 10, 4, 202, 47, 104, 0, 16, 22, 10, 8, 10, 4, 202, 47, 108, 0, 16, 22, 10, 8, 10, 4, 202, 47, 126, 0, 16, 24, 10, 8, 10, 4, 202, 47, 128, 0, 16, 24, 10, 8, 10, 4, 202, 47, 130, 0, 16, 23, 10, 8, 10, 4, 202, 52, 33, 0, 16, 24, 10, 8, 10, 4, 202, 52, 34, 0, 16, 24, 10, 8, 10, 4, 202, 52, 47, 0, 16, 24, 10, 8, 10, 4, 202, 52, 143, 0, 16, 24, 10, 8, 10, 4, 202, 53, 140, 0, 16, 24, 10, 8, 10, 4, 202, 53, 143, 0, 16, 24, 10, 8, 10, 4, 202, 57, 192, 0, 16, 22, 10, 8, 10, 4, 202, 57, 196, 0, 16, 22, 10, 8, 10, 4, 202, 57, 200, 0, 16, 22, 10, 8, 10, 4, 202, 57, 204, 0, 16, 22, 10, 8, 10, 4, 202, 57, 212, 0, 16, 22, 10, 8, 10, 4, 202, 57, 216, 0, 16, 22, 10, 8, 10, 4, 202, 57, 240, 0, 16, 20, 10, 8, 10, 4, 202, 58, 0, 0, 16, 24, 10, 8, 10, 4, 202, 58, 104, 0, 16, 22, 10, 8, 10, 4, 202, 58, 112, 0, 16, 22, 10, 8, 10, 4, 202, 59, 0, 0, 16, 24, 10, 8, 10, 4, 202, 59, 1, 0, 16, 24, 10, 8, 10, 4, 202, 59, 212, 0, 16, 22, 10, 8, 10, 4, 202, 59, 236, 0, 16, 24, 10, 8, 10, 4, 202, 59, 240, 0, 16, 24, 10, 8, 10, 4, 202, 60, 48, 0, 16, 21, 10, 8, 10, 4, 202, 60, 96, 0, 16, 21, 10, 8, 10, 4, 202, 60, 112, 0, 16, 20, 10, 8, 10, 4, 202, 60, 132, 0, 16, 22, 10, 8, 10, 4, 202, 60, 136, 0, 16, 21, 10, 8, 10, 4, 202, 60, 144, 0, 16, 20, 10, 8, 10, 4, 202, 61, 68, 0, 16, 22, 10, 8, 10, 4, 202, 61, 76, 0, 16, 22, 10, 8, 10, 4, 202, 61, 88, 0, 16, 22, 10, 8, 10, 4, 202, 61, 123, 0, 16, 24, 10, 8, 10, 4, 202, 61, 127, 0, 16, 24, 10, 8, 10, 4, 202, 62, 112, 0, 16, 22, 10, 8, 10, 4, 202, 62, 248, 0, 16, 22, 10, 8, 10, 4, 202, 62, 252, 0, 16, 24, 10, 8, 10, 4, 202, 62, 255, 0, 16, 24, 10, 8, 10, 4, 202, 63, 80, 0, 16, 24, 10, 8, 10, 4, 202, 63, 81, 0, 16, 24, 10, 8, 10, 4, 202, 63, 82, 0, 16, 23, 10, 8, 10, 4, 202, 63, 84, 0, 16, 22, 10, 8, 10, 4, 202, 63, 88, 0, 16, 21, 10, 8, 10, 4, 202, 63, 160, 0, 16, 19, 10, 8, 10, 4, 202, 63, 248, 0, 16, 22, 10, 8, 10, 4, 202, 63, 253, 0, 16, 24, 10, 8, 10, 4, 202, 65, 0, 0, 16, 21, 10, 8, 10, 4, 202, 65, 8, 0, 16, 23, 10, 8, 10, 4, 202, 65, 96, 0, 16, 22, 10, 8, 10, 4, 202, 65, 100, 0, 16, 22, 10, 8, 10, 4, 202, 65, 104, 0, 16, 22, 10, 8, 10, 4, 202, 65, 108, 0, 16, 22, 10, 8, 10, 4, 202, 66, 168, 0, 16, 22, 10, 8, 10, 4, 202, 67, 0, 0, 16, 22, 10, 8, 10, 4, 202, 69, 4, 0, 16, 22, 10, 8, 10, 4, 202, 69, 16, 0, 16, 20, 10, 8, 10, 4, 202, 70, 0, 0, 16, 19, 10, 8, 10, 4, 202, 70, 96, 0, 16, 20, 10, 8, 10, 4, 202, 70, 192, 0, 16, 20, 10, 8, 10, 4, 202, 71, 32, 0, 16, 22, 10, 8, 10, 4, 202, 71, 36, 0, 16, 22, 10, 8, 10, 4, 202, 71, 40, 0, 16, 22, 10, 8, 10, 4, 202, 71, 44, 0, 16, 22, 10, 8, 10, 4, 202, 72, 40, 0, 16, 21, 10, 8, 10, 4, 202, 72, 80, 0, 16, 20, 10, 8, 10, 4, 202, 72, 112, 0, 16, 22, 10, 8, 10, 4, 202, 72, 116, 0, 16, 22, 10, 8, 10, 4, 202, 72, 120, 0, 16, 22, 10, 8, 10, 4, 202, 72, 124, 0, 16, 22, 10, 8, 10, 4, 202, 73, 128, 0, 16, 22, 10, 8, 10, 4, 202, 73, 240, 0, 16, 22, 10, 8, 10, 4, 202, 73, 244, 0, 16, 22, 10, 8, 10, 4, 202, 73, 248, 0, 16, 22, 10, 8, 10, 4, 202, 73, 252, 0, 16, 22, 10, 8, 10, 4, 202, 74, 8, 0, 16, 21, 10, 8, 10, 4, 202, 74, 36, 0, 16, 24, 10, 8, 10, 4, 202, 74, 42, 0, 16, 24, 10, 8, 10, 4, 202, 74, 52, 0, 16, 24, 10, 8, 10, 4, 202, 74, 80, 0, 16, 20, 10, 8, 10, 4, 202, 74, 232, 0, 16, 22, 10, 8, 10, 4, 202, 74, 254, 0, 16, 23, 10, 8, 10, 4, 202, 75, 208, 0, 16, 20, 10, 8, 10, 4, 202, 75, 252, 0, 16, 22, 10, 8, 10, 4, 202, 76, 252, 0, 16, 22, 10, 8, 10, 4, 202, 77, 80, 0, 16, 21, 10, 8, 10, 4, 202, 77, 92, 0, 16, 22, 10, 8, 10, 4, 202, 78, 8, 0, 16, 21, 10, 8, 10, 4, 202, 79, 224, 0, 16, 21, 10, 8, 10, 4, 202, 79, 248, 0, 16, 22, 10, 8, 10, 4, 202, 80, 192, 0, 16, 21, 10, 8, 10, 4, 202, 80, 200, 0, 16, 21, 10, 8, 10, 4, 202, 81, 0, 0, 16, 22, 10, 8, 10, 4, 202, 81, 176, 0, 16, 22, 10, 8, 10, 4, 202, 81, 180, 0, 16, 22, 10, 8, 10, 4, 202, 81, 184, 0, 16, 22, 10, 8, 10, 4, 202, 81, 188, 0, 16, 22, 10, 8, 10, 4, 202, 83, 252, 0, 16, 22, 10, 8, 10, 4, 202, 84, 0, 0, 16, 22, 10, 8, 10, 4, 202, 84, 4, 0, 16, 22, 10, 8, 10, 4, 202, 84, 8, 0, 16, 21, 10, 8, 10, 4, 202, 84, 16, 0, 16, 23, 10, 8, 10, 4, 202, 84, 22, 0, 16, 24, 10, 8, 10, 4, 202, 84, 24, 0, 16, 21, 10, 8, 10, 4, 202, 85, 208, 0, 16, 20, 10, 8, 10, 4, 202, 86, 249, 0, 16, 24, 10, 8, 10, 4, 202, 86, 252, 0, 16, 22, 10, 8, 10, 4, 202, 87, 80, 0, 16, 20, 10, 8, 10, 4, 202, 88, 32, 0, 16, 22, 10, 8, 10, 4, 202, 89, 8, 0, 16, 21, 10, 8, 10, 4, 202, 89, 96, 0, 16, 22, 10, 8, 10, 4, 202, 89, 108, 0, 16, 22, 10, 8, 10, 4, 202, 89, 119, 0, 16, 24, 10, 8, 10, 4, 202, 89, 232, 0, 16, 21, 10, 8, 10, 4, 202, 90, 0, 0, 16, 22, 10, 8, 10, 4, 202, 90, 16, 0, 16, 22, 10, 8, 10, 4, 202, 90, 20, 0, 16, 22, 10, 8, 10, 4, 202, 90, 24, 0, 16, 22, 10, 8, 10, 4, 202, 90, 28, 0, 16, 22, 10, 8, 10, 4, 202, 90, 37, 0, 16, 24, 10, 8, 10, 4, 202, 90, 96, 0, 16, 22, 10, 8, 10, 4, 202, 90, 100, 0, 16, 22, 10, 8, 10, 4, 202, 90, 104, 0, 16, 22, 10, 8, 10, 4, 202, 90, 108, 0, 16, 22, 10, 8, 10, 4, 202, 90, 112, 0, 16, 20, 10, 8, 10, 4, 202, 90, 193, 0, 16, 24, 10, 8, 10, 4, 202, 90, 196, 0, 16, 24, 10, 8, 10, 4, 202, 90, 205, 0, 16, 24, 10, 8, 10, 4, 202, 90, 224, 0, 16, 20, 10, 8, 10, 4, 202, 91, 0, 0, 16, 22, 10, 8, 10, 4, 202, 91, 36, 0, 16, 22, 10, 8, 10, 4, 202, 91, 96, 0, 16, 20, 10, 8, 10, 4, 202, 91, 128, 0, 16, 22, 10, 8, 10, 4, 202, 91, 176, 0, 16, 20, 10, 8, 10, 4, 202, 91, 224, 0, 16, 19, 10, 8, 10, 4, 202, 92, 0, 0, 16, 22, 10, 8, 10, 4, 202, 92, 8, 0, 16, 21, 10, 8, 10, 4, 202, 92, 48, 0, 16, 20, 10, 8, 10, 4, 202, 92, 252, 0, 16, 22, 10, 8, 10, 4, 202, 93, 0, 0, 16, 22, 10, 8, 10, 4, 202, 93, 252, 0, 16, 22, 10, 8, 10, 4, 202, 94, 74, 0, 16, 24, 10, 8, 10, 4, 202, 94, 81, 0, 16, 24, 10, 8, 10, 4, 202, 94, 92, 0, 16, 22, 10, 8, 10, 4, 202, 95, 0, 0, 16, 22, 10, 8, 10, 4, 202, 95, 4, 0, 16, 22, 10, 8, 10, 4, 202, 95, 8, 0, 16, 21, 10, 8, 10, 4, 202, 95, 16, 0, 16, 20, 10, 8, 10, 4, 202, 95, 240, 0, 16, 21, 10, 8, 10, 4, 202, 95, 252, 0, 16, 22, 10, 8, 10, 4, 202, 96, 0, 0, 16, 18, 10, 8, 10, 4, 202, 96, 64, 0, 16, 21, 10, 8, 10, 4, 202, 96, 72, 0, 16, 21, 10, 8, 10, 4, 202, 96, 80, 0, 16, 20, 10, 8, 10, 4, 202, 96, 96, 0, 16, 21, 10, 8, 10, 4, 202, 96, 104, 0, 16, 21, 10, 8, 10, 4, 202, 96, 112, 0, 16, 20, 10, 8, 10, 4, 202, 96, 128, 0, 16, 21, 10, 8, 10, 4, 202, 96, 136, 0, 16, 21, 10, 8, 10, 4, 202, 96, 144, 0, 16, 20, 10, 8, 10, 4, 202, 96, 160, 0, 16, 21, 10, 8, 10, 4, 202, 96, 168, 0, 16, 21, 10, 8, 10, 4, 202, 96, 176, 0, 16, 20, 10, 8, 10, 4, 202, 96, 192, 0, 16, 21, 10, 8, 10, 4, 202, 96, 200, 0, 16, 21, 10, 8, 10, 4, 202, 96, 208, 0, 16, 20, 10, 8, 10, 4, 202, 96, 224, 0, 16, 21, 10, 8, 10, 4, 202, 96, 232, 0, 16, 21, 10, 8, 10, 4, 202, 96, 240, 0, 16, 20, 10, 8, 10, 4, 202, 97, 0, 0, 16, 21, 10, 8, 10, 4, 202, 97, 8, 0, 16, 21, 10, 8, 10, 4, 202, 97, 16, 0, 16, 20, 10, 8, 10, 4, 202, 97, 32, 0, 16, 19, 10, 8, 10, 4, 202, 97, 64, 0, 16, 19, 10, 8, 10, 4, 202, 97, 96, 0, 16, 20, 10, 8, 10, 4, 202, 97, 112, 0, 16, 20, 10, 8, 10, 4, 202, 97, 128, 0, 16, 18, 10, 8, 10, 4, 202, 97, 192, 0, 16, 19, 10, 8, 10, 4, 202, 97, 224, 0, 16, 21, 10, 8, 10, 4, 202, 97, 232, 0, 16, 21, 10, 8, 10, 4, 202, 97, 240, 0, 16, 20, 10, 8, 10, 4, 202, 98, 0, 0, 16, 21, 10, 8, 10, 4, 202, 98, 8, 0, 16, 21, 10, 8, 10, 4, 202, 98, 16, 0, 16, 20, 10, 8, 10, 4, 202, 98, 32, 0, 16, 21, 10, 8, 10, 4, 202, 98, 40, 0, 16, 21, 10, 8, 10, 4, 202, 98, 48, 0, 16, 20, 10, 8, 10, 4, 202, 98, 64, 0, 16, 19, 10, 8, 10, 4, 202, 98, 96, 0, 16, 21, 10, 8, 10, 4, 202, 98, 104, 0, 16, 21, 10, 8, 10, 4, 202, 98, 112, 0, 16, 20, 10, 8, 10, 4, 202, 98, 128, 0, 16, 19, 10, 8, 10, 4, 202, 98, 160, 0, 16, 21, 10, 8, 10, 4, 202, 98, 168, 0, 16, 21, 10, 8, 10, 4, 202, 98, 176, 0, 16, 20, 10, 8, 10, 4, 202, 98, 192, 0, 16, 21, 10, 8, 10, 4, 202, 98, 200, 0, 16, 21, 10, 8, 10, 4, 202, 98, 208, 0, 16, 20, 10, 8, 10, 4, 202, 98, 224, 0, 16, 21, 10, 8, 10, 4, 202, 98, 232, 0, 16, 21, 10, 8, 10, 4, 202, 98, 240, 0, 16, 20, 10, 8, 10, 4, 202, 99, 0, 0, 16, 18, 10, 8, 10, 4, 202, 99, 64, 0, 16, 19, 10, 8, 10, 4, 202, 99, 96, 0, 16, 21, 10, 8, 10, 4, 202, 99, 104, 0, 16, 21, 10, 8, 10, 4, 202, 99, 112, 0, 16, 20, 10, 8, 10, 4, 202, 99, 128, 0, 16, 19, 10, 8, 10, 4, 202, 99, 160, 0, 16, 21, 10, 8, 10, 4, 202, 99, 168, 0, 16, 21, 10, 8, 10, 4, 202, 99, 176, 0, 16, 20, 10, 8, 10, 4, 202, 99, 192, 0, 16, 21, 10, 8, 10, 4, 202, 99, 200, 0, 16, 21, 10, 8, 10, 4, 202, 99, 208, 0, 16, 20, 10, 8, 10, 4, 202, 99, 224, 0, 16, 21, 10, 8, 10, 4, 202, 99, 232, 0, 16, 21, 10, 8, 10, 4, 202, 99, 240, 0, 16, 20, 10, 8, 10, 4, 202, 100, 0, 0, 16, 21, 10, 8, 10, 4, 202, 100, 8, 0, 16, 21, 10, 8, 10, 4, 202, 100, 16, 0, 16, 20, 10, 8, 10, 4, 202, 100, 32, 0, 16, 19, 10, 8, 10, 4, 202, 100, 64, 0, 16, 21, 10, 8, 10, 4, 202, 100, 72, 0, 16, 21, 10, 8, 10, 4, 202, 100, 80, 0, 16, 20, 10, 8, 10, 4, 202, 100, 96, 0, 16, 21, 10, 8, 10, 4, 202, 100, 104, 0, 16, 21, 10, 8, 10, 4, 202, 100, 112, 0, 16, 20, 10, 8, 10, 4, 202, 100, 128, 0, 16, 21, 10, 8, 10, 4, 202, 100, 136, 0, 16, 21, 10, 8, 10, 4, 202, 100, 144, 0, 16, 20, 10, 8, 10, 4, 202, 100, 160, 0, 16, 21, 10, 8, 10, 4, 202, 100, 168, 0, 16, 21, 10, 8, 10, 4, 202, 100, 176, 0, 16, 20, 10, 8, 10, 4, 202, 100, 192, 0, 16, 21, 10, 8, 10, 4, 202, 100, 200, 0, 16, 21, 10, 8, 10, 4, 202, 100, 208, 0, 16, 20, 10, 8, 10, 4, 202, 100, 224, 0, 16, 19, 10, 8, 10, 4, 202, 101, 0, 0, 16, 18, 10, 8, 10, 4, 202, 101, 64, 0, 16, 19, 10, 8, 10, 4, 202, 101, 96, 0, 16, 19, 10, 8, 10, 4, 202, 101, 128, 0, 16, 18, 10, 8, 10, 4, 202, 101, 192, 0, 16, 19, 10, 8, 10, 4, 202, 101, 224, 0, 16, 21, 10, 8, 10, 4, 202, 101, 232, 0, 16, 21, 10, 8, 10, 4, 202, 101, 240, 0, 16, 20, 10, 8, 10, 4, 202, 102, 0, 0, 16, 19, 10, 8, 10, 4, 202, 102, 32, 0, 16, 19, 10, 8, 10, 4, 202, 102, 64, 0, 16, 18, 10, 8, 10, 4, 202, 102, 128, 0, 16, 21, 10, 8, 10, 4, 202, 102, 136, 0, 16, 21, 10, 8, 10, 4, 202, 102, 144, 0, 16, 20, 10, 8, 10, 4, 202, 102, 160, 0, 16, 19, 10, 8, 10, 4, 202, 102, 192, 0, 16, 21, 10, 8, 10, 4, 202, 102, 200, 0, 16, 21, 10, 8, 10, 4, 202, 102, 208, 0, 16, 20, 10, 8, 10, 4, 202, 102, 224, 0, 16, 21, 10, 8, 10, 4, 202, 102, 232, 0, 16, 21, 10, 8, 10, 4, 202, 102, 240, 0, 16, 20, 10, 8, 10, 4, 202, 103, 0, 0, 16, 21, 10, 8, 10, 4, 202, 103, 8, 0, 16, 21, 10, 8, 10, 4, 202, 103, 16, 0, 16, 20, 10, 8, 10, 4, 202, 103, 32, 0, 16, 19, 10, 8, 10, 4, 202, 103, 64, 0, 16, 19, 10, 8, 10, 4, 202, 103, 96, 0, 16, 21, 10, 8, 10, 4, 202, 103, 104, 0, 16, 21, 10, 8, 10, 4, 202, 103, 112, 0, 16, 20, 10, 8, 10, 4, 202, 103, 128, 0, 16, 18, 10, 8, 10, 4, 202, 103, 192, 0, 16, 19, 10, 8, 10, 4, 202, 103, 224, 0, 16, 21, 10, 8, 10, 4, 202, 103, 232, 0, 16, 21, 10, 8, 10, 4, 202, 103, 240, 0, 16, 20, 10, 8, 10, 4, 202, 104, 0, 0, 16, 15, 10, 8, 10, 4, 202, 106, 0, 0, 16, 16, 10, 8, 10, 4, 202, 107, 0, 0, 16, 17, 10, 8, 10, 4, 202, 107, 128, 0, 16, 17, 10, 8, 10, 4, 202, 108, 0, 0, 16, 16, 10, 8, 10, 4, 202, 109, 0, 0, 16, 16, 10, 8, 10, 4, 202, 110, 0, 0, 16, 18, 10, 8, 10, 4, 202, 110, 64, 0, 16, 18, 10, 8, 10, 4, 202, 110, 128, 0, 16, 18, 10, 8, 10, 4, 202, 110, 192, 0, 16, 18, 10, 8, 10, 4, 202, 111, 0, 0, 16, 17, 10, 8, 10, 4, 202, 111, 128, 0, 16, 19, 10, 8, 10, 4, 202, 111, 160, 0, 16, 19, 10, 8, 10, 4, 202, 111, 192, 0, 16, 18, 10, 8, 10, 4, 202, 112, 0, 0, 16, 16, 10, 8, 10, 4, 202, 113, 0, 0, 16, 20, 10, 8, 10, 4, 202, 113, 16, 0, 16, 20, 10, 8, 10, 4, 202, 113, 32, 0, 16, 19, 10, 8, 10, 4, 202, 113, 64, 0, 16, 18, 10, 8, 10, 4, 202, 113, 128, 0, 16, 18, 10, 8, 10, 4, 202, 113, 192, 0, 16, 19, 10, 8, 10, 4, 202, 113, 224, 0, 16, 20, 10, 8, 10, 4, 202, 113, 240, 0, 16, 20, 10, 8, 10, 4, 202, 114, 0, 0, 16, 19, 10, 8, 10, 4, 202, 114, 32, 0, 16, 19, 10, 8, 10, 4, 202, 114, 64, 0, 16, 18, 10, 8, 10, 4, 202, 114, 128, 0, 16, 17, 10, 8, 10, 4, 202, 115, 0, 0, 16, 19, 10, 8, 10, 4, 202, 115, 32, 0, 16, 19, 10, 8, 10, 4, 202, 115, 64, 0, 16, 18, 10, 8, 10, 4, 202, 115, 128, 0, 16, 17, 10, 8, 10, 4, 202, 116, 0, 0, 16, 19, 10, 8, 10, 4, 202, 116, 32, 0, 16, 20, 10, 8, 10, 4, 202, 116, 48, 0, 16, 20, 10, 8, 10, 4, 202, 116, 64, 0, 16, 19, 10, 8, 10, 4, 202, 116, 96, 0, 16, 19, 10, 8, 10, 4, 202, 116, 128, 0, 16, 17, 10, 8, 10, 4, 202, 117, 0, 0, 16, 18, 10, 8, 10, 4, 202, 117, 64, 0, 16, 18, 10, 8, 10, 4, 202, 117, 128, 0, 16, 17, 10, 8, 10, 4, 202, 118, 0, 0, 16, 19, 10, 8, 10, 4, 202, 118, 32, 0, 16, 19, 10, 8, 10, 4, 202, 118, 64, 0, 16, 18, 10, 8, 10, 4, 202, 118, 128, 0, 16, 17, 10, 8, 10, 4, 202, 119, 0, 0, 16, 19, 10, 8, 10, 4, 202, 119, 32, 0, 16, 19, 10, 8, 10, 4, 202, 119, 64, 0, 16, 20, 10, 8, 10, 4, 202, 119, 80, 0, 16, 20, 10, 8, 10, 4, 202, 119, 96, 0, 16, 19, 10, 8, 10, 4, 202, 119, 128, 0, 16, 17, 10, 8, 10, 4, 202, 120, 0, 0, 16, 18, 10, 8, 10, 4, 202, 120, 64, 0, 16, 18, 10, 8, 10, 4, 202, 120, 128, 0, 16, 17, 10, 8, 10, 4, 202, 121, 0, 0, 16, 16, 10, 8, 10, 4, 202, 122, 0, 0, 16, 21, 10, 8, 10, 4, 202, 122, 32, 0, 16, 21, 10, 8, 10, 4, 202, 122, 64, 0, 16, 19, 10, 8, 10, 4, 202, 122, 112, 0, 16, 21, 10, 8, 10, 4, 202, 122, 120, 0, 16, 21, 10, 8, 10, 4, 202, 122, 128, 0, 16, 24, 10, 8, 10, 4, 202, 122, 132, 0, 16, 24, 10, 8, 10, 4, 202, 123, 96, 0, 16, 20, 10, 8, 10, 4, 202, 123, 116, 0, 16, 22, 10, 8, 10, 4, 202, 123, 120, 0, 16, 22, 10, 8, 10, 4, 202, 124, 16, 0, 16, 21, 10, 8, 10, 4, 202, 124, 24, 0, 16, 22, 10, 8, 10, 4, 202, 125, 107, 0, 16, 24, 10, 8, 10, 4, 202, 125, 109, 0, 16, 24, 10, 8, 10, 4, 202, 125, 112, 0, 16, 20, 10, 8, 10, 4, 202, 125, 176, 0, 16, 20, 10, 8, 10, 4, 202, 127, 0, 0, 16, 23, 10, 8, 10, 4, 202, 127, 2, 0, 16, 24, 10, 8, 10, 4, 202, 127, 3, 0, 16, 24, 10, 8, 10, 4, 202, 127, 4, 0, 16, 24, 10, 8, 10, 4, 202, 127, 5, 0, 16, 24, 10, 8, 10, 4, 202, 127, 6, 0, 16, 23, 10, 8, 10, 4, 202, 127, 12, 0, 16, 22, 10, 8, 10, 4, 202, 127, 16, 0, 16, 20, 10, 8, 10, 4, 202, 127, 40, 0, 16, 21, 10, 8, 10, 4, 202, 127, 48, 0, 16, 20, 10, 8, 10, 4, 202, 127, 112, 0, 16, 20, 10, 8, 10, 4, 202, 127, 128, 0, 16, 20, 10, 8, 10, 4, 202, 127, 144, 0, 16, 20, 10, 8, 10, 4, 202, 127, 160, 0, 16, 21, 10, 8, 10, 4, 202, 127, 192, 0, 16, 23, 10, 8, 10, 4, 202, 127, 194, 0, 16, 23, 10, 8, 10, 4, 202, 127, 196, 0, 16, 22, 10, 8, 10, 4, 202, 127, 200, 0, 16, 21, 10, 8, 10, 4, 202, 127, 208, 0, 16, 24, 10, 8, 10, 4, 202, 127, 209, 0, 16, 24, 10, 8, 10, 4, 202, 127, 212, 0, 16, 22, 10, 8, 10, 4, 202, 127, 216, 0, 16, 21, 10, 8, 10, 4, 202, 127, 224, 0, 16, 19, 10, 8, 10, 4, 202, 129, 208, 0, 16, 24, 10, 8, 10, 4, 202, 130, 0, 0, 16, 19, 10, 8, 10, 4, 202, 130, 39, 0, 16, 24, 10, 8, 10, 4, 202, 130, 224, 0, 16, 19, 10, 8, 10, 4, 202, 131, 16, 0, 16, 21, 10, 8, 10, 4, 202, 131, 48, 0, 16, 20, 10, 8, 10, 4, 202, 131, 208, 0, 16, 20, 10, 8, 10, 4, 202, 133, 32, 0, 16, 20, 10, 8, 10, 4, 202, 134, 58, 0, 16, 24, 10, 8, 10, 4, 202, 134, 128, 0, 16, 20, 10, 8, 10, 4, 202, 134, 208, 0, 16, 22, 10, 8, 10, 4, 202, 134, 212, 0, 16, 22, 10, 8, 10, 4, 202, 134, 216, 0, 16, 22, 10, 8, 10, 4, 202, 134, 220, 0, 16, 22, 10, 8, 10, 4, 202, 136, 48, 0, 16, 20, 10, 8, 10, 4, 202, 136, 208, 0, 16, 20, 10, 8, 10, 4, 202, 136, 224, 0, 16, 20, 10, 8, 10, 4, 202, 136, 248, 0, 16, 22, 10, 8, 10, 4, 202, 137, 231, 0, 16, 24, 10, 8, 10, 4, 202, 140, 140, 0, 16, 22, 10, 8, 10, 4, 202, 140, 144, 0, 16, 22, 10, 8, 10, 4, 202, 140, 148, 0, 16, 22, 10, 8, 10, 4, 202, 140, 152, 0, 16, 22, 10, 8, 10, 4, 202, 140, 156, 0, 16, 22, 10, 8, 10, 4, 202, 141, 160, 0, 16, 19, 10, 8, 10, 4, 202, 142, 16, 0, 16, 20, 10, 8, 10, 4, 202, 143, 4, 0, 16, 22, 10, 8, 10, 4, 202, 143, 16, 0, 16, 20, 10, 8, 10, 4, 202, 143, 32, 0, 16, 20, 10, 8, 10, 4, 202, 143, 56, 0, 16, 21, 10, 8, 10, 4, 202, 143, 100, 0, 16, 22, 10, 8, 10, 4, 202, 143, 104, 0, 16, 22, 10, 8, 10, 4, 202, 144, 196, 0, 16, 22, 10, 8, 10, 4, 202, 146, 160, 0, 16, 20, 10, 8, 10, 4, 202, 146, 186, 0, 16, 24, 10, 8, 10, 4, 202, 146, 188, 0, 16, 22, 10, 8, 10, 4, 202, 146, 196, 0, 16, 22, 10, 8, 10, 4, 202, 146, 200, 0, 16, 21, 10, 8, 10, 4, 202, 147, 144, 0, 16, 20, 10, 8, 10, 4, 202, 148, 32, 0, 16, 20, 10, 8, 10, 4, 202, 148, 64, 0, 16, 19, 10, 8, 10, 4, 202, 148, 96, 0, 16, 19, 10, 8, 10, 4, 202, 149, 32, 0, 16, 19, 10, 8, 10, 4, 202, 149, 160, 0, 16, 19, 10, 8, 10, 4, 202, 149, 224, 0, 16, 19, 10, 8, 10, 4, 202, 150, 16, 0, 16, 20, 10, 8, 10, 4, 202, 150, 32, 0, 16, 20, 10, 8, 10, 4, 202, 150, 56, 0, 16, 22, 10, 8, 10, 4, 202, 150, 192, 0, 16, 20, 10, 8, 10, 4, 202, 150, 224, 0, 16, 19, 10, 8, 10, 4, 202, 151, 0, 0, 16, 22, 10, 8, 10, 4, 202, 151, 33, 0, 16, 24, 10, 8, 10, 4, 202, 151, 128, 0, 16, 19, 10, 8, 10, 4, 202, 152, 176, 0, 16, 20, 10, 8, 10, 4, 202, 153, 0, 0, 16, 22, 10, 8, 10, 4, 202, 153, 7, 0, 16, 24, 10, 8, 10, 4, 202, 153, 48, 0, 16, 20, 10, 8, 10, 4, 202, 157, 192, 0, 16, 19, 10, 8, 10, 4, 202, 158, 160, 0, 16, 19, 10, 8, 10, 4, 202, 158, 242, 0, 16, 24, 10, 8, 10, 4, 202, 160, 140, 0, 16, 22, 10, 8, 10, 4, 202, 160, 156, 0, 16, 22, 10, 8, 10, 4, 202, 160, 176, 0, 16, 20, 10, 8, 10, 4, 202, 162, 67, 0, 16, 24, 10, 8, 10, 4, 202, 162, 75, 0, 16, 24, 10, 8, 10, 4, 202, 164, 0, 0, 16, 20, 10, 8, 10, 4, 202, 164, 96, 0, 16, 19, 10, 8, 10, 4, 202, 165, 96, 0, 16, 20, 10, 8, 10, 4, 202, 165, 176, 0, 16, 20, 10, 8, 10, 4, 202, 165, 208, 0, 16, 20, 10, 8, 10, 4, 202, 165, 239, 0, 16, 24, 10, 8, 10, 4, 202, 165, 240, 0, 16, 23, 10, 8, 10, 4, 202, 165, 243, 0, 16, 24, 10, 8, 10, 4, 202, 165, 245, 0, 16, 24, 10, 8, 10, 4, 202, 165, 251, 0, 16, 24, 10, 8, 10, 4, 202, 165, 252, 0, 16, 22, 10, 8, 10, 4, 202, 166, 224, 0, 16, 19, 10, 8, 10, 4, 202, 168, 80, 0, 16, 22, 10, 8, 10, 4, 202, 168, 128, 0, 16, 22, 10, 8, 10, 4, 202, 168, 132, 0, 16, 22, 10, 8, 10, 4, 202, 168, 136, 0, 16, 22, 10, 8, 10, 4, 202, 168, 140, 0, 16, 22, 10, 8, 10, 4, 202, 168, 160, 0, 16, 20, 10, 8, 10, 4, 202, 168, 176, 0, 16, 20, 10, 8, 10, 4, 202, 170, 128, 0, 16, 19, 10, 8, 10, 4, 202, 170, 216, 0, 16, 21, 10, 8, 10, 4, 202, 170, 224, 0, 16, 19, 10, 8, 10, 4, 202, 171, 216, 0, 16, 21, 10, 8, 10, 4, 202, 171, 232, 0, 16, 24, 10, 8, 10, 4, 202, 171, 235, 0, 16, 24, 10, 8, 10, 4, 202, 172, 0, 0, 16, 22, 10, 8, 10, 4, 202, 172, 7, 0, 16, 24, 10, 8, 10, 4, 202, 173, 0, 0, 16, 22, 10, 8, 10, 4, 202, 173, 6, 0, 16, 24, 10, 8, 10, 4, 202, 173, 8, 0, 16, 21, 10, 8, 10, 4, 202, 173, 112, 0, 16, 22, 10, 8, 10, 4, 202, 173, 224, 0, 16, 19, 10, 8, 10, 4, 202, 174, 64, 0, 16, 20, 10, 8, 10, 4, 202, 174, 124, 0, 16, 22, 10, 8, 10, 4, 202, 176, 224, 0, 16, 19, 10, 8, 10, 4, 202, 179, 160, 0, 16, 22, 10, 8, 10, 4, 202, 179, 164, 0, 16, 22, 10, 8, 10, 4, 202, 179, 168, 0, 16, 22, 10, 8, 10, 4, 202, 179, 172, 0, 16, 22, 10, 8, 10, 4, 202, 179, 240, 0, 16, 20, 10, 8, 10, 4, 202, 180, 128, 0, 16, 19, 10, 8, 10, 4, 202, 180, 208, 0, 16, 21, 10, 8, 10, 4, 202, 181, 8, 0, 16, 22, 10, 8, 10, 4, 202, 181, 28, 0, 16, 22, 10, 8, 10, 4, 202, 181, 112, 0, 16, 20, 10, 8, 10, 4, 202, 182, 32, 0, 16, 20, 10, 8, 10, 4, 202, 182, 192, 0, 16, 19, 10, 8, 10, 4, 202, 189, 0, 0, 16, 18, 10, 8, 10, 4, 202, 189, 80, 0, 16, 20, 10, 8, 10, 4, 202, 189, 184, 0, 16, 21, 10, 8, 10, 4, 202, 191, 0, 0, 16, 24, 10, 8, 10, 4, 202, 191, 68, 0, 16, 22, 10, 8, 10, 4, 202, 191, 72, 0, 16, 21, 10, 8, 10, 4, 202, 191, 80, 0, 16, 20, 10, 8, 10, 4, 202, 192, 0, 0, 16, 13, 10, 8, 10, 4, 202, 200, 0, 0, 16, 14, 10, 8, 10, 4, 202, 204, 0, 0, 16, 14, 10, 8, 10, 4, 203, 0, 4, 0, 16, 22, 10, 8, 10, 4, 203, 0, 10, 0, 16, 23, 10, 8, 10, 4, 203, 0, 18, 0, 16, 24, 10, 8, 10, 4, 203, 0, 24, 0, 16, 24, 10, 8, 10, 4, 203, 0, 42, 0, 16, 23, 10, 8, 10, 4, 203, 0, 45, 0, 16, 24, 10, 8, 10, 4, 203, 0, 46, 0, 16, 23, 10, 8, 10, 4, 203, 0, 81, 0, 16, 24, 10, 8, 10, 4, 203, 0, 82, 0, 16, 23, 10, 8, 10, 4, 203, 0, 90, 0, 16, 23, 10, 8, 10, 4, 203, 0, 96, 0, 16, 23, 10, 8, 10, 4, 203, 0, 104, 0, 16, 21, 10, 8, 10, 4, 203, 0, 114, 0, 16, 23, 10, 8, 10, 4, 203, 0, 122, 0, 16, 24, 10, 8, 10, 4, 203, 0, 128, 0, 16, 24, 10, 8, 10, 4, 203, 0, 130, 0, 16, 23, 10, 8, 10, 4, 203, 0, 132, 0, 16, 22, 10, 8, 10, 4, 203, 0, 137, 0, 16, 24, 10, 8, 10, 4, 203, 0, 142, 0, 16, 24, 10, 8, 10, 4, 203, 0, 144, 0, 16, 24, 10, 8, 10, 4, 203, 0, 146, 0, 16, 24, 10, 8, 10, 4, 203, 0, 148, 0, 16, 24, 10, 8, 10, 4, 203, 0, 150, 0, 16, 23, 10, 8, 10, 4, 203, 0, 152, 0, 16, 24, 10, 8, 10, 4, 203, 0, 177, 0, 16, 24, 10, 8, 10, 4, 203, 0, 224, 0, 16, 24, 10, 8, 10, 4, 203, 1, 4, 0, 16, 22, 10, 8, 10, 4, 203, 1, 18, 0, 16, 24, 10, 8, 10, 4, 203, 1, 26, 0, 16, 23, 10, 8, 10, 4, 203, 1, 65, 0, 16, 24, 10, 8, 10, 4, 203, 1, 66, 0, 16, 23, 10, 8, 10, 4, 203, 1, 70, 0, 16, 23, 10, 8, 10, 4, 203, 1, 76, 0, 16, 23, 10, 8, 10, 4, 203, 1, 90, 0, 16, 24, 10, 8, 10, 4, 203, 1, 97, 0, 16, 24, 10, 8, 10, 4, 203, 1, 98, 0, 16, 23, 10, 8, 10, 4, 203, 1, 100, 0, 16, 22, 10, 8, 10, 4, 203, 1, 108, 0, 16, 24, 10, 8, 10, 4, 203, 1, 253, 0, 16, 24, 10, 8, 10, 4, 203, 1, 254, 0, 16, 24, 10, 8, 10, 4, 203, 2, 64, 0, 16, 21, 10, 8, 10, 4, 203, 2, 73, 0, 16, 24, 10, 8, 10, 4, 203, 2, 112, 0, 16, 21, 10, 8, 10, 4, 203, 2, 126, 0, 16, 23, 10, 8, 10, 4, 203, 2, 140, 0, 16, 24, 10, 8, 10, 4, 203, 2, 150, 0, 16, 24, 10, 8, 10, 4, 203, 2, 152, 0, 16, 22, 10, 8, 10, 4, 203, 2, 156, 0, 16, 23, 10, 8, 10, 4, 203, 2, 160, 0, 16, 21, 10, 8, 10, 4, 203, 2, 180, 0, 16, 23, 10, 8, 10, 4, 203, 2, 196, 0, 16, 23, 10, 8, 10, 4, 203, 2, 209, 0, 16, 24, 10, 8, 10, 4, 203, 2, 214, 0, 16, 23, 10, 8, 10, 4, 203, 2, 226, 0, 16, 23, 10, 8, 10, 4, 203, 2, 229, 0, 16, 24, 10, 8, 10, 4, 203, 2, 236, 0, 16, 23, 10, 8, 10, 4, 203, 3, 68, 0, 16, 24, 10, 8, 10, 4, 203, 3, 72, 0, 16, 23, 10, 8, 10, 4, 203, 3, 75, 0, 16, 24, 10, 8, 10, 4, 203, 3, 80, 0, 16, 21, 10, 8, 10, 4, 203, 3, 96, 0, 16, 22, 10, 8, 10, 4, 203, 3, 105, 0, 16, 24, 10, 8, 10, 4, 203, 3, 112, 0, 16, 21, 10, 8, 10, 4, 203, 3, 120, 0, 16, 24, 10, 8, 10, 4, 203, 3, 123, 0, 16, 24, 10, 8, 10, 4, 203, 3, 135, 0, 16, 24, 10, 8, 10, 4, 203, 3, 139, 0, 16, 24, 10, 8, 10, 4, 203, 3, 143, 0, 16, 24, 10, 8, 10, 4, 203, 4, 132, 0, 16, 23, 10, 8, 10, 4, 203, 4, 134, 0, 16, 24, 10, 8, 10, 4, 203, 4, 151, 0, 16, 24, 10, 8, 10, 4, 203, 4, 152, 0, 16, 22, 10, 8, 10, 4, 203, 4, 174, 0, 16, 23, 10, 8, 10, 4, 203, 4, 180, 0, 16, 24, 10, 8, 10, 4, 203, 4, 186, 0, 16, 24, 10, 8, 10, 4, 203, 4, 205, 0, 16, 24, 10, 8, 10, 4, 203, 4, 208, 0, 16, 22, 10, 8, 10, 4, 203, 4, 227, 0, 16, 24, 10, 8, 10, 4, 203, 4, 230, 0, 16, 23, 10, 8, 10, 4, 203, 5, 4, 0, 16, 23, 10, 8, 10, 4, 203, 5, 7, 0, 16, 24, 10, 8, 10, 4, 203, 5, 8, 0, 16, 23, 10, 8, 10, 4, 203, 5, 11, 0, 16, 24, 10, 8, 10, 4, 203, 5, 21, 0, 16, 24, 10, 8, 10, 4, 203, 5, 22, 0, 16, 24, 10, 8, 10, 4, 203, 5, 44, 0, 16, 24, 10, 8, 10, 4, 203, 5, 46, 0, 16, 23, 10, 8, 10, 4, 203, 5, 52, 0, 16, 22, 10, 8, 10, 4, 203, 5, 56, 0, 16, 23, 10, 8, 10, 4, 203, 5, 60, 0, 16, 23, 10, 8, 10, 4, 203, 5, 114, 0, 16, 23, 10, 8, 10, 4, 203, 5, 118, 0, 16, 24, 10, 8, 10, 4, 203, 5, 120, 0, 16, 24, 10, 8, 10, 4, 203, 5, 172, 0, 16, 24, 10, 8, 10, 4, 203, 5, 180, 0, 16, 23, 10, 8, 10, 4, 203, 5, 182, 0, 16, 24, 10, 8, 10, 4, 203, 5, 185, 0, 16, 24, 10, 8, 10, 4, 203, 5, 186, 0, 16, 24, 10, 8, 10, 4, 203, 5, 188, 0, 16, 23, 10, 8, 10, 4, 203, 5, 190, 0, 16, 24, 10, 8, 10, 4, 203, 5, 195, 0, 16, 24, 10, 8, 10, 4, 203, 5, 214, 0, 16, 23, 10, 8, 10, 4, 203, 5, 218, 0, 16, 23, 10, 8, 10, 4, 203, 6, 131, 0, 16, 24, 10, 8, 10, 4, 203, 6, 136, 0, 16, 24, 10, 8, 10, 4, 203, 6, 138, 0, 16, 23, 10, 8, 10, 4, 203, 6, 142, 0, 16, 24, 10, 8, 10, 4, 203, 6, 150, 0, 16, 23, 10, 8, 10, 4, 203, 6, 157, 0, 16, 24, 10, 8, 10, 4, 203, 6, 159, 0, 16, 24, 10, 8, 10, 4, 203, 6, 224, 0, 16, 20, 10, 8, 10, 4, 203, 6, 248, 0, 16, 23, 10, 8, 10, 4, 203, 7, 129, 0, 16, 24, 10, 8, 10, 4, 203, 7, 138, 0, 16, 23, 10, 8, 10, 4, 203, 7, 147, 0, 16, 24, 10, 8, 10, 4, 203, 7, 150, 0, 16, 23, 10, 8, 10, 4, 203, 7, 158, 0, 16, 24, 10, 8, 10, 4, 203, 7, 192, 0, 16, 23, 10, 8, 10, 4, 203, 7, 200, 0, 16, 24, 10, 8, 10, 4, 203, 8, 0, 0, 16, 24, 10, 8, 10, 4, 203, 8, 8, 0, 16, 24, 10, 8, 10, 4, 203, 8, 23, 0, 16, 24, 10, 8, 10, 4, 203, 8, 24, 0, 16, 21, 10, 8, 10, 4, 203, 8, 70, 0, 16, 24, 10, 8, 10, 4, 203, 8, 82, 0, 16, 24, 10, 8, 10, 4, 203, 8, 86, 0, 16, 23, 10, 8, 10, 4, 203, 8, 91, 0, 16, 24, 10, 8, 10, 4, 203, 8, 110, 0, 16, 23, 10, 8, 10, 4, 203, 8, 115, 0, 16, 24, 10, 8, 10, 4, 203, 8, 166, 0, 16, 23, 10, 8, 10, 4, 203, 8, 169, 0, 16, 24, 10, 8, 10, 4, 203, 8, 173, 0, 16, 24, 10, 8, 10, 4, 203, 8, 184, 0, 16, 24, 10, 8, 10, 4, 203, 8, 186, 0, 16, 23, 10, 8, 10, 4, 203, 8, 190, 0, 16, 23, 10, 8, 10, 4, 203, 8, 192, 0, 16, 24, 10, 8, 10, 4, 203, 8, 197, 0, 16, 24, 10, 8, 10, 4, 203, 8, 198, 0, 16, 23, 10, 8, 10, 4, 203, 8, 203, 0, 16, 24, 10, 8, 10, 4, 203, 8, 209, 0, 16, 24, 10, 8, 10, 4, 203, 8, 210, 0, 16, 23, 10, 8, 10, 4, 203, 8, 212, 0, 16, 22, 10, 8, 10, 4, 203, 8, 217, 0, 16, 24, 10, 8, 10, 4, 203, 8, 220, 0, 16, 24, 10, 8, 10, 4, 203, 9, 32, 0, 16, 24, 10, 8, 10, 4, 203, 9, 36, 0, 16, 23, 10, 8, 10, 4, 203, 9, 57, 0, 16, 24, 10, 8, 10, 4, 203, 9, 63, 0, 16, 24, 10, 8, 10, 4, 203, 9, 65, 0, 16, 24, 10, 8, 10, 4, 203, 9, 70, 0, 16, 23, 10, 8, 10, 4, 203, 9, 72, 0, 16, 24, 10, 8, 10, 4, 203, 9, 75, 0, 16, 24, 10, 8, 10, 4, 203, 9, 76, 0, 16, 23, 10, 8, 10, 4, 203, 9, 96, 0, 16, 22, 10, 8, 10, 4, 203, 9, 100, 0, 16, 23, 10, 8, 10, 4, 203, 9, 108, 0, 16, 24, 10, 8, 10, 4, 203, 9, 158, 0, 16, 24, 10, 8, 10, 4, 203, 10, 34, 0, 16, 24, 10, 8, 10, 4, 203, 10, 56, 0, 16, 24, 10, 8, 10, 4, 203, 10, 74, 0, 16, 23, 10, 8, 10, 4, 203, 10, 84, 0, 16, 22, 10, 8, 10, 4, 203, 10, 88, 0, 16, 24, 10, 8, 10, 4, 203, 10, 95, 0, 16, 24, 10, 8, 10, 4, 203, 10, 125, 0, 16, 24, 10, 8, 10, 4, 203, 11, 70, 0, 16, 24, 10, 8, 10, 4, 203, 11, 76, 0, 16, 22, 10, 8, 10, 4, 203, 11, 82, 0, 16, 24, 10, 8, 10, 4, 203, 11, 84, 0, 16, 22, 10, 8, 10, 4, 203, 11, 100, 0, 16, 22, 10, 8, 10, 4, 203, 11, 109, 0, 16, 24, 10, 8, 10, 4, 203, 11, 117, 0, 16, 24, 10, 8, 10, 4, 203, 11, 122, 0, 16, 24, 10, 8, 10, 4, 203, 11, 126, 0, 16, 24, 10, 8, 10, 4, 203, 11, 136, 0, 16, 22, 10, 8, 10, 4, 203, 11, 141, 0, 16, 24, 10, 8, 10, 4, 203, 11, 142, 0, 16, 23, 10, 8, 10, 4, 203, 11, 180, 0, 16, 22, 10, 8, 10, 4, 203, 11, 208, 0, 16, 22, 10, 8, 10, 4, 203, 12, 16, 0, 16, 24, 10, 8, 10, 4, 203, 12, 19, 0, 16, 24, 10, 8, 10, 4, 203, 12, 24, 0, 16, 24, 10, 8, 10, 4, 203, 12, 57, 0, 16, 24, 10, 8, 10, 4, 203, 12, 65, 0, 16, 24, 10, 8, 10, 4, 203, 12, 66, 0, 16, 24, 10, 8, 10, 4, 203, 12, 70, 0, 16, 23, 10, 8, 10, 4, 203, 12, 87, 0, 16, 24, 10, 8, 10, 4, 203, 12, 88, 0, 16, 21, 10, 8, 10, 4, 203, 12, 100, 0, 16, 23, 10, 8, 10, 4, 203, 12, 103, 0, 16, 24, 10, 8, 10, 4, 203, 12, 114, 0, 16, 24, 10, 8, 10, 4, 203, 12, 118, 0, 16, 24, 10, 8, 10, 4, 203, 12, 130, 0, 16, 24, 10, 8, 10, 4, 203, 12, 137, 0, 16, 24, 10, 8, 10, 4, 203, 12, 196, 0, 16, 22, 10, 8, 10, 4, 203, 12, 200, 0, 16, 21, 10, 8, 10, 4, 203, 12, 211, 0, 16, 24, 10, 8, 10, 4, 203, 12, 219, 0, 16, 24, 10, 8, 10, 4, 203, 12, 226, 0, 16, 24, 10, 8, 10, 4, 203, 12, 240, 0, 16, 22, 10, 8, 10, 4, 203, 13, 18, 0, 16, 24, 10, 8, 10, 4, 203, 13, 24, 0, 16, 24, 10, 8, 10, 4, 203, 13, 44, 0, 16, 23, 10, 8, 10, 4, 203, 13, 80, 0, 16, 21, 10, 8, 10, 4, 203, 13, 88, 0, 16, 23, 10, 8, 10, 4, 203, 13, 92, 0, 16, 22, 10, 8, 10, 4, 203, 13, 173, 0, 16, 24, 10, 8, 10, 4, 203, 13, 224, 0, 16, 23, 10, 8, 10, 4, 203, 13, 227, 0, 16, 24, 10, 8, 10, 4, 203, 13, 233, 0, 16, 24, 10, 8, 10, 4, 203, 14, 24, 0, 16, 22, 10, 8, 10, 4, 203, 14, 33, 0, 16, 24, 10, 8, 10, 4, 203, 14, 56, 0, 16, 24, 10, 8, 10, 4, 203, 14, 61, 0, 16, 24, 10, 8, 10, 4, 203, 14, 62, 0, 16, 24, 10, 8, 10, 4, 203, 14, 104, 0, 16, 24, 10, 8, 10, 4, 203, 14, 114, 0, 16, 23, 10, 8, 10, 4, 203, 14, 118, 0, 16, 24, 10, 8, 10, 4, 203, 14, 162, 0, 16, 24, 10, 8, 10, 4, 203, 14, 184, 0, 16, 21, 10, 8, 10, 4, 203, 14, 192, 0, 16, 24, 10, 8, 10, 4, 203, 14, 194, 0, 16, 23, 10, 8, 10, 4, 203, 14, 214, 0, 16, 24, 10, 8, 10, 4, 203, 14, 231, 0, 16, 24, 10, 8, 10, 4, 203, 14, 246, 0, 16, 24, 10, 8, 10, 4, 203, 15, 0, 0, 16, 20, 10, 8, 10, 4, 203, 15, 20, 0, 16, 23, 10, 8, 10, 4, 203, 15, 22, 0, 16, 24, 10, 8, 10, 4, 203, 15, 87, 0, 16, 24, 10, 8, 10, 4, 203, 15, 88, 0, 16, 23, 10, 8, 10, 4, 203, 15, 105, 0, 16, 24, 10, 8, 10, 4, 203, 15, 112, 0, 16, 21, 10, 8, 10, 4, 203, 15, 130, 0, 16, 23, 10, 8, 10, 4, 203, 15, 149, 0, 16, 24, 10, 8, 10, 4, 203, 15, 151, 0, 16, 24, 10, 8, 10, 4, 203, 15, 156, 0, 16, 22, 10, 8, 10, 4, 203, 15, 174, 0, 16, 24, 10, 8, 10, 4, 203, 15, 227, 0, 16, 24, 10, 8, 10, 4, 203, 15, 232, 0, 16, 21, 10, 8, 10, 4, 203, 15, 240, 0, 16, 23, 10, 8, 10, 4, 203, 15, 246, 0, 16, 24, 10, 8, 10, 4, 203, 16, 10, 0, 16, 24, 10, 8, 10, 4, 203, 16, 12, 0, 16, 23, 10, 8, 10, 4, 203, 16, 16, 0, 16, 21, 10, 8, 10, 4, 203, 16, 27, 0, 16, 24, 10, 8, 10, 4, 203, 16, 38, 0, 16, 24, 10, 8, 10, 4, 203, 16, 49, 0, 16, 24, 10, 8, 10, 4, 203, 16, 50, 0, 16, 23, 10, 8, 10, 4, 203, 16, 58, 0, 16, 24, 10, 8, 10, 4, 203, 16, 63, 0, 16, 24, 10, 8, 10, 4, 203, 16, 133, 0, 16, 24, 10, 8, 10, 4, 203, 16, 161, 0, 16, 24, 10, 8, 10, 4, 203, 16, 162, 0, 16, 24, 10, 8, 10, 4, 203, 16, 186, 0, 16, 23, 10, 8, 10, 4, 203, 16, 228, 0, 16, 24, 10, 8, 10, 4, 203, 16, 238, 0, 16, 24, 10, 8, 10, 4, 203, 16, 240, 0, 16, 24, 10, 8, 10, 4, 203, 16, 245, 0, 16, 24, 10, 8, 10, 4, 203, 17, 2, 0, 16, 24, 10, 8, 10, 4, 203, 17, 18, 0, 16, 24, 10, 8, 10, 4, 203, 17, 28, 0, 16, 24, 10, 8, 10, 4, 203, 17, 39, 0, 16, 24, 10, 8, 10, 4, 203, 17, 56, 0, 16, 24, 10, 8, 10, 4, 203, 17, 74, 0, 16, 23, 10, 8, 10, 4, 203, 17, 88, 0, 16, 23, 10, 8, 10, 4, 203, 17, 136, 0, 16, 24, 10, 8, 10, 4, 203, 17, 164, 0, 16, 24, 10, 8, 10, 4, 203, 17, 187, 0, 16, 24, 10, 8, 10, 4, 203, 17, 190, 0, 16, 23, 10, 8, 10, 4, 203, 17, 231, 0, 16, 24, 10, 8, 10, 4, 203, 17, 233, 0, 16, 24, 10, 8, 10, 4, 203, 17, 248, 0, 16, 24, 10, 8, 10, 4, 203, 17, 249, 0, 16, 24, 10, 8, 10, 4, 203, 17, 255, 0, 16, 24, 10, 8, 10, 4, 203, 18, 2, 0, 16, 23, 10, 8, 10, 4, 203, 18, 4, 0, 16, 24, 10, 8, 10, 4, 203, 18, 7, 0, 16, 24, 10, 8, 10, 4, 203, 18, 31, 0, 16, 24, 10, 8, 10, 4, 203, 18, 37, 0, 16, 24, 10, 8, 10, 4, 203, 18, 48, 0, 16, 23, 10, 8, 10, 4, 203, 18, 52, 0, 16, 24, 10, 8, 10, 4, 203, 18, 72, 0, 16, 22, 10, 8, 10, 4, 203, 18, 80, 0, 16, 23, 10, 8, 10, 4, 203, 18, 87, 0, 16, 24, 10, 8, 10, 4, 203, 18, 100, 0, 16, 23, 10, 8, 10, 4, 203, 18, 105, 0, 16, 24, 10, 8, 10, 4, 203, 18, 107, 0, 16, 24, 10, 8, 10, 4, 203, 18, 110, 0, 16, 24, 10, 8, 10, 4, 203, 18, 129, 0, 16, 24, 10, 8, 10, 4, 203, 18, 131, 0, 16, 24, 10, 8, 10, 4, 203, 18, 132, 0, 16, 23, 10, 8, 10, 4, 203, 18, 144, 0, 16, 24, 10, 8, 10, 4, 203, 18, 153, 0, 16, 24, 10, 8, 10, 4, 203, 18, 199, 0, 16, 24, 10, 8, 10, 4, 203, 18, 208, 0, 16, 24, 10, 8, 10, 4, 203, 18, 211, 0, 16, 24, 10, 8, 10, 4, 203, 18, 215, 0, 16, 24, 10, 8, 10, 4, 203, 19, 1, 0, 16, 24, 10, 8, 10, 4, 203, 19, 18, 0, 16, 24, 10, 8, 10, 4, 203, 19, 24, 0, 16, 24, 10, 8, 10, 4, 203, 19, 30, 0, 16, 24, 10, 8, 10, 4, 203, 19, 32, 0, 16, 21, 10, 8, 10, 4, 203, 19, 41, 0, 16, 24, 10, 8, 10, 4, 203, 19, 44, 0, 16, 23, 10, 8, 10, 4, 203, 19, 46, 0, 16, 24, 10, 8, 10, 4, 203, 19, 58, 0, 16, 24, 10, 8, 10, 4, 203, 19, 60, 0, 16, 23, 10, 8, 10, 4, 203, 19, 64, 0, 16, 24, 10, 8, 10, 4, 203, 19, 68, 0, 16, 24, 10, 8, 10, 4, 203, 19, 72, 0, 16, 24, 10, 8, 10, 4, 203, 19, 101, 0, 16, 24, 10, 8, 10, 4, 203, 19, 111, 0, 16, 24, 10, 8, 10, 4, 203, 19, 131, 0, 16, 24, 10, 8, 10, 4, 203, 19, 133, 0, 16, 24, 10, 8, 10, 4, 203, 19, 144, 0, 16, 24, 10, 8, 10, 4, 203, 19, 147, 0, 16, 24, 10, 8, 10, 4, 203, 19, 149, 0, 16, 24, 10, 8, 10, 4, 203, 19, 156, 0, 16, 24, 10, 8, 10, 4, 203, 19, 176, 0, 16, 24, 10, 8, 10, 4, 203, 19, 178, 0, 16, 23, 10, 8, 10, 4, 203, 19, 208, 0, 16, 24, 10, 8, 10, 4, 203, 19, 228, 0, 16, 22, 10, 8, 10, 4, 203, 19, 233, 0, 16, 24, 10, 8, 10, 4, 203, 19, 242, 0, 16, 24, 10, 8, 10, 4, 203, 19, 248, 0, 16, 23, 10, 8, 10, 4, 203, 19, 255, 0, 16, 24, 10, 8, 10, 4, 203, 20, 17, 0, 16, 24, 10, 8, 10, 4, 203, 20, 40, 0, 16, 23, 10, 8, 10, 4, 203, 20, 44, 0, 16, 24, 10, 8, 10, 4, 203, 20, 48, 0, 16, 24, 10, 8, 10, 4, 203, 20, 61, 0, 16, 24, 10, 8, 10, 4, 203, 20, 65, 0, 16, 24, 10, 8, 10, 4, 203, 20, 84, 0, 16, 23, 10, 8, 10, 4, 203, 20, 89, 0, 16, 24, 10, 8, 10, 4, 203, 20, 106, 0, 16, 23, 10, 8, 10, 4, 203, 20, 115, 0, 16, 24, 10, 8, 10, 4, 203, 20, 117, 0, 16, 24, 10, 8, 10, 4, 203, 20, 118, 0, 16, 23, 10, 8, 10, 4, 203, 20, 122, 0, 16, 24, 10, 8, 10, 4, 203, 20, 126, 0, 16, 23, 10, 8, 10, 4, 203, 20, 135, 0, 16, 24, 10, 8, 10, 4, 203, 20, 136, 0, 16, 21, 10, 8, 10, 4, 203, 20, 150, 0, 16, 24, 10, 8, 10, 4, 203, 20, 230, 0, 16, 24, 10, 8, 10, 4, 203, 20, 232, 0, 16, 24, 10, 8, 10, 4, 203, 20, 236, 0, 16, 24, 10, 8, 10, 4, 203, 21, 0, 0, 16, 23, 10, 8, 10, 4, 203, 21, 2, 0, 16, 24, 10, 8, 10, 4, 203, 21, 8, 0, 16, 24, 10, 8, 10, 4, 203, 21, 10, 0, 16, 24, 10, 8, 10, 4, 203, 21, 18, 0, 16, 24, 10, 8, 10, 4, 203, 21, 33, 0, 16, 24, 10, 8, 10, 4, 203, 21, 34, 0, 16, 24, 10, 8, 10, 4, 203, 21, 41, 0, 16, 24, 10, 8, 10, 4, 203, 21, 44, 0, 16, 24, 10, 8, 10, 4, 203, 21, 68, 0, 16, 24, 10, 8, 10, 4, 203, 21, 82, 0, 16, 24, 10, 8, 10, 4, 203, 21, 96, 0, 16, 22, 10, 8, 10, 4, 203, 21, 124, 0, 16, 24, 10, 8, 10, 4, 203, 21, 136, 0, 16, 23, 10, 8, 10, 4, 203, 21, 145, 0, 16, 24, 10, 8, 10, 4, 203, 21, 206, 0, 16, 24, 10, 8, 10, 4, 203, 22, 24, 0, 16, 24, 10, 8, 10, 4, 203, 22, 28, 0, 16, 23, 10, 8, 10, 4, 203, 22, 31, 0, 16, 24, 10, 8, 10, 4, 203, 22, 68, 0, 16, 24, 10, 8, 10, 4, 203, 22, 76, 0, 16, 24, 10, 8, 10, 4, 203, 22, 78, 0, 16, 24, 10, 8, 10, 4, 203, 22, 84, 0, 16, 24, 10, 8, 10, 4, 203, 22, 87, 0, 16, 24, 10, 8, 10, 4, 203, 22, 92, 0, 16, 22, 10, 8, 10, 4, 203, 22, 99, 0, 16, 24, 10, 8, 10, 4, 203, 22, 106, 0, 16, 24, 10, 8, 10, 4, 203, 22, 122, 0, 16, 23, 10, 8, 10, 4, 203, 22, 131, 0, 16, 24, 10, 8, 10, 4, 203, 22, 163, 0, 16, 24, 10, 8, 10, 4, 203, 22, 166, 0, 16, 24, 10, 8, 10, 4, 203, 22, 170, 0, 16, 24, 10, 8, 10, 4, 203, 22, 176, 0, 16, 21, 10, 8, 10, 4, 203, 22, 194, 0, 16, 24, 10, 8, 10, 4, 203, 22, 242, 0, 16, 23, 10, 8, 10, 4, 203, 22, 245, 0, 16, 24, 10, 8, 10, 4, 203, 22, 246, 0, 16, 24, 10, 8, 10, 4, 203, 22, 252, 0, 16, 23, 10, 8, 10, 4, 203, 23, 0, 0, 16, 24, 10, 8, 10, 4, 203, 23, 47, 0, 16, 24, 10, 8, 10, 4, 203, 23, 61, 0, 16, 24, 10, 8, 10, 4, 203, 23, 62, 0, 16, 23, 10, 8, 10, 4, 203, 23, 73, 0, 16, 24, 10, 8, 10, 4, 203, 23, 85, 0, 16, 24, 10, 8, 10, 4, 203, 23, 92, 0, 16, 22, 10, 8, 10, 4, 203, 23, 98, 0, 16, 24, 10, 8, 10, 4, 203, 23, 107, 0, 16, 24, 10, 8, 10, 4, 203, 23, 112, 0, 16, 24, 10, 8, 10, 4, 203, 23, 130, 0, 16, 24, 10, 8, 10, 4, 203, 23, 140, 0, 16, 23, 10, 8, 10, 4, 203, 23, 172, 0, 16, 24, 10, 8, 10, 4, 203, 23, 182, 0, 16, 24, 10, 8, 10, 4, 203, 23, 186, 0, 16, 23, 10, 8, 10, 4, 203, 23, 192, 0, 16, 24, 10, 8, 10, 4, 203, 23, 197, 0, 16, 24, 10, 8, 10, 4, 203, 23, 198, 0, 16, 24, 10, 8, 10, 4, 203, 23, 204, 0, 16, 22, 10, 8, 10, 4, 203, 23, 224, 0, 16, 24, 10, 8, 10, 4, 203, 23, 226, 0, 16, 23, 10, 8, 10, 4, 203, 23, 228, 0, 16, 22, 10, 8, 10, 4, 203, 23, 249, 0, 16, 24, 10, 8, 10, 4, 203, 23, 251, 0, 16, 24, 10, 8, 10, 4, 203, 24, 13, 0, 16, 24, 10, 8, 10, 4, 203, 24, 18, 0, 16, 24, 10, 8, 10, 4, 203, 24, 27, 0, 16, 24, 10, 8, 10, 4, 203, 24, 43, 0, 16, 24, 10, 8, 10, 4, 203, 24, 56, 0, 16, 24, 10, 8, 10, 4, 203, 24, 58, 0, 16, 24, 10, 8, 10, 4, 203, 24, 67, 0, 16, 24, 10, 8, 10, 4, 203, 24, 74, 0, 16, 24, 10, 8, 10, 4, 203, 24, 79, 0, 16, 24, 10, 8, 10, 4, 203, 24, 80, 0, 16, 23, 10, 8, 10, 4, 203, 24, 84, 0, 16, 23, 10, 8, 10, 4, 203, 24, 86, 0, 16, 24, 10, 8, 10, 4, 203, 24, 90, 0, 16, 24, 10, 8, 10, 4, 203, 24, 111, 0, 16, 24, 10, 8, 10, 4, 203, 24, 112, 0, 16, 24, 10, 8, 10, 4, 203, 24, 116, 0, 16, 24, 10, 8, 10, 4, 203, 24, 122, 0, 16, 23, 10, 8, 10, 4, 203, 24, 145, 0, 16, 24, 10, 8, 10, 4, 203, 24, 152, 0, 16, 23, 10, 8, 10, 4, 203, 24, 157, 0, 16, 24, 10, 8, 10, 4, 203, 24, 161, 0, 16, 24, 10, 8, 10, 4, 203, 24, 167, 0, 16, 24, 10, 8, 10, 4, 203, 24, 186, 0, 16, 23, 10, 8, 10, 4, 203, 24, 199, 0, 16, 24, 10, 8, 10, 4, 203, 24, 202, 0, 16, 24, 10, 8, 10, 4, 203, 24, 212, 0, 16, 23, 10, 8, 10, 4, 203, 24, 217, 0, 16, 24, 10, 8, 10, 4, 203, 24, 219, 0, 16, 24, 10, 8, 10, 4, 203, 24, 244, 0, 16, 24, 10, 8, 10, 4, 203, 25, 19, 0, 16, 24, 10, 8, 10, 4, 203, 25, 20, 0, 16, 23, 10, 8, 10, 4, 203, 25, 46, 0, 16, 24, 10, 8, 10, 4, 203, 25, 48, 0, 16, 21, 10, 8, 10, 4, 203, 25, 64, 0, 16, 23, 10, 8, 10, 4, 203, 25, 91, 0, 16, 24, 10, 8, 10, 4, 203, 25, 99, 0, 16, 24, 10, 8, 10, 4, 203, 25, 100, 0, 16, 24, 10, 8, 10, 4, 203, 25, 106, 0, 16, 24, 10, 8, 10, 4, 203, 25, 131, 0, 16, 24, 10, 8, 10, 4, 203, 25, 135, 0, 16, 24, 10, 8, 10, 4, 203, 25, 138, 0, 16, 24, 10, 8, 10, 4, 203, 25, 147, 0, 16, 24, 10, 8, 10, 4, 203, 25, 153, 0, 16, 24, 10, 8, 10, 4, 203, 25, 154, 0, 16, 23, 10, 8, 10, 4, 203, 25, 164, 0, 16, 24, 10, 8, 10, 4, 203, 25, 166, 0, 16, 24, 10, 8, 10, 4, 203, 25, 174, 0, 16, 23, 10, 8, 10, 4, 203, 25, 180, 0, 16, 24, 10, 8, 10, 4, 203, 25, 182, 0, 16, 24, 10, 8, 10, 4, 203, 25, 191, 0, 16, 24, 10, 8, 10, 4, 203, 25, 199, 0, 16, 24, 10, 8, 10, 4, 203, 25, 200, 0, 16, 24, 10, 8, 10, 4, 203, 25, 202, 0, 16, 23, 10, 8, 10, 4, 203, 25, 208, 0, 16, 20, 10, 8, 10, 4, 203, 25, 229, 0, 16, 24, 10, 8, 10, 4, 203, 25, 235, 0, 16, 24, 10, 8, 10, 4, 203, 25, 236, 0, 16, 24, 10, 8, 10, 4, 203, 25, 242, 0, 16, 24, 10, 8, 10, 4, 203, 26, 12, 0, 16, 24, 10, 8, 10, 4, 203, 26, 34, 0, 16, 24, 10, 8, 10, 4, 203, 26, 49, 0, 16, 24, 10, 8, 10, 4, 203, 26, 50, 0, 16, 24, 10, 8, 10, 4, 203, 26, 55, 0, 16, 24, 10, 8, 10, 4, 203, 26, 56, 0, 16, 23, 10, 8, 10, 4, 203, 26, 60, 0, 16, 24, 10, 8, 10, 4, 203, 26, 65, 0, 16, 24, 10, 8, 10, 4, 203, 26, 68, 0, 16, 24, 10, 8, 10, 4, 203, 26, 76, 0, 16, 24, 10, 8, 10, 4, 203, 26, 80, 0, 16, 24, 10, 8, 10, 4, 203, 26, 84, 0, 16, 24, 10, 8, 10, 4, 203, 26, 97, 0, 16, 24, 10, 8, 10, 4, 203, 26, 102, 0, 16, 23, 10, 8, 10, 4, 203, 26, 115, 0, 16, 24, 10, 8, 10, 4, 203, 26, 116, 0, 16, 24, 10, 8, 10, 4, 203, 26, 129, 0, 16, 24, 10, 8, 10, 4, 203, 26, 143, 0, 16, 24, 10, 8, 10, 4, 203, 26, 144, 0, 16, 24, 10, 8, 10, 4, 203, 26, 148, 0, 16, 23, 10, 8, 10, 4, 203, 26, 154, 0, 16, 24, 10, 8, 10, 4, 203, 26, 158, 0, 16, 23, 10, 8, 10, 4, 203, 26, 170, 0, 16, 24, 10, 8, 10, 4, 203, 26, 173, 0, 16, 24, 10, 8, 10, 4, 203, 26, 176, 0, 16, 24, 10, 8, 10, 4, 203, 26, 185, 0, 16, 24, 10, 8, 10, 4, 203, 26, 202, 0, 16, 23, 10, 8, 10, 4, 203, 26, 210, 0, 16, 24, 10, 8, 10, 4, 203, 26, 214, 0, 16, 24, 10, 8, 10, 4, 203, 26, 222, 0, 16, 24, 10, 8, 10, 4, 203, 26, 224, 0, 16, 24, 10, 8, 10, 4, 203, 26, 228, 0, 16, 24, 10, 8, 10, 4, 203, 26, 232, 0, 16, 24, 10, 8, 10, 4, 203, 27, 0, 0, 16, 24, 10, 8, 10, 4, 203, 27, 10, 0, 16, 24, 10, 8, 10, 4, 203, 27, 15, 0, 16, 24, 10, 8, 10, 4, 203, 27, 16, 0, 16, 24, 10, 8, 10, 4, 203, 27, 20, 0, 16, 24, 10, 8, 10, 4, 203, 27, 22, 0, 16, 23, 10, 8, 10, 4, 203, 27, 40, 0, 16, 24, 10, 8, 10, 4, 203, 27, 45, 0, 16, 24, 10, 8, 10, 4, 203, 27, 53, 0, 16, 24, 10, 8, 10, 4, 203, 27, 65, 0, 16, 24, 10, 8, 10, 4, 203, 27, 66, 0, 16, 24, 10, 8, 10, 4, 203, 27, 81, 0, 16, 24, 10, 8, 10, 4, 203, 27, 88, 0, 16, 24, 10, 8, 10, 4, 203, 27, 102, 0, 16, 24, 10, 8, 10, 4, 203, 27, 109, 0, 16, 24, 10, 8, 10, 4, 203, 27, 117, 0, 16, 24, 10, 8, 10, 4, 203, 27, 121, 0, 16, 24, 10, 8, 10, 4, 203, 27, 122, 0, 16, 23, 10, 8, 10, 4, 203, 27, 125, 0, 16, 24, 10, 8, 10, 4, 203, 27, 200, 0, 16, 24, 10, 8, 10, 4, 203, 27, 202, 0, 16, 24, 10, 8, 10, 4, 203, 27, 233, 0, 16, 24, 10, 8, 10, 4, 203, 27, 241, 0, 16, 24, 10, 8, 10, 4, 203, 27, 250, 0, 16, 24, 10, 8, 10, 4, 203, 28, 10, 0, 16, 24, 10, 8, 10, 4, 203, 28, 12, 0, 16, 24, 10, 8, 10, 4, 203, 28, 33, 0, 16, 24, 10, 8, 10, 4, 203, 28, 34, 0, 16, 23, 10, 8, 10, 4, 203, 28, 43, 0, 16, 24, 10, 8, 10, 4, 203, 28, 44, 0, 16, 24, 10, 8, 10, 4, 203, 28, 54, 0, 16, 24, 10, 8, 10, 4, 203, 28, 56, 0, 16, 24, 10, 8, 10, 4, 203, 28, 73, 0, 16, 24, 10, 8, 10, 4, 203, 28, 74, 0, 16, 24, 10, 8, 10, 4, 203, 28, 76, 0, 16, 24, 10, 8, 10, 4, 203, 28, 86, 0, 16, 24, 10, 8, 10, 4, 203, 28, 88, 0, 16, 24, 10, 8, 10, 4, 203, 28, 112, 0, 16, 24, 10, 8, 10, 4, 203, 28, 131, 0, 16, 24, 10, 8, 10, 4, 203, 28, 136, 0, 16, 24, 10, 8, 10, 4, 203, 28, 140, 0, 16, 24, 10, 8, 10, 4, 203, 28, 145, 0, 16, 24, 10, 8, 10, 4, 203, 28, 165, 0, 16, 24, 10, 8, 10, 4, 203, 28, 169, 0, 16, 24, 10, 8, 10, 4, 203, 28, 170, 0, 16, 24, 10, 8, 10, 4, 203, 28, 178, 0, 16, 23, 10, 8, 10, 4, 203, 28, 185, 0, 16, 24, 10, 8, 10, 4, 203, 28, 187, 0, 16, 24, 10, 8, 10, 4, 203, 28, 196, 0, 16, 24, 10, 8, 10, 4, 203, 28, 226, 0, 16, 23, 10, 8, 10, 4, 203, 28, 239, 0, 16, 24, 10, 8, 10, 4, 203, 29, 2, 0, 16, 24, 10, 8, 10, 4, 203, 29, 8, 0, 16, 23, 10, 8, 10, 4, 203, 29, 13, 0, 16, 24, 10, 8, 10, 4, 203, 29, 14, 0, 16, 24, 10, 8, 10, 4, 203, 29, 28, 0, 16, 24, 10, 8, 10, 4, 203, 29, 46, 0, 16, 24, 10, 8, 10, 4, 203, 29, 57, 0, 16, 24, 10, 8, 10, 4, 203, 29, 61, 0, 16, 24, 10, 8, 10, 4, 203, 29, 63, 0, 16, 24, 10, 8, 10, 4, 203, 29, 69, 0, 16, 24, 10, 8, 10, 4, 203, 29, 73, 0, 16, 24, 10, 8, 10, 4, 203, 29, 81, 0, 16, 24, 10, 8, 10, 4, 203, 29, 90, 0, 16, 24, 10, 8, 10, 4, 203, 29, 95, 0, 16, 24, 10, 8, 10, 4, 203, 29, 100, 0, 16, 24, 10, 8, 10, 4, 203, 29, 103, 0, 16, 24, 10, 8, 10, 4, 203, 29, 112, 0, 16, 24, 10, 8, 10, 4, 203, 29, 120, 0, 16, 22, 10, 8, 10, 4, 203, 29, 182, 0, 16, 23, 10, 8, 10, 4, 203, 29, 187, 0, 16, 24, 10, 8, 10, 4, 203, 29, 189, 0, 16, 24, 10, 8, 10, 4, 203, 29, 190, 0, 16, 24, 10, 8, 10, 4, 203, 29, 205, 0, 16, 24, 10, 8, 10, 4, 203, 29, 210, 0, 16, 24, 10, 8, 10, 4, 203, 29, 217, 0, 16, 24, 10, 8, 10, 4, 203, 29, 227, 0, 16, 24, 10, 8, 10, 4, 203, 29, 231, 0, 16, 24, 10, 8, 10, 4, 203, 29, 233, 0, 16, 24, 10, 8, 10, 4, 203, 29, 234, 0, 16, 24, 10, 8, 10, 4, 203, 29, 248, 0, 16, 24, 10, 8, 10, 4, 203, 29, 254, 0, 16, 23, 10, 8, 10, 4, 203, 30, 16, 0, 16, 23, 10, 8, 10, 4, 203, 30, 25, 0, 16, 24, 10, 8, 10, 4, 203, 30, 27, 0, 16, 24, 10, 8, 10, 4, 203, 30, 29, 0, 16, 24, 10, 8, 10, 4, 203, 30, 66, 0, 16, 24, 10, 8, 10, 4, 203, 30, 81, 0, 16, 24, 10, 8, 10, 4, 203, 30, 87, 0, 16, 24, 10, 8, 10, 4, 203, 30, 111, 0, 16, 24, 10, 8, 10, 4, 203, 30, 121, 0, 16, 24, 10, 8, 10, 4, 203, 30, 123, 0, 16, 24, 10, 8, 10, 4, 203, 30, 152, 0, 16, 24, 10, 8, 10, 4, 203, 30, 156, 0, 16, 24, 10, 8, 10, 4, 203, 30, 162, 0, 16, 24, 10, 8, 10, 4, 203, 30, 173, 0, 16, 24, 10, 8, 10, 4, 203, 30, 175, 0, 16, 24, 10, 8, 10, 4, 203, 30, 187, 0, 16, 24, 10, 8, 10, 4, 203, 30, 194, 0, 16, 24, 10, 8, 10, 4, 203, 30, 217, 0, 16, 24, 10, 8, 10, 4, 203, 30, 220, 0, 16, 24, 10, 8, 10, 4, 203, 30, 222, 0, 16, 24, 10, 8, 10, 4, 203, 30, 232, 0, 16, 23, 10, 8, 10, 4, 203, 30, 235, 0, 16, 24, 10, 8, 10, 4, 203, 30, 240, 0, 16, 23, 10, 8, 10, 4, 203, 30, 246, 0, 16, 24, 10, 8, 10, 4, 203, 30, 250, 0, 16, 23, 10, 8, 10, 4, 203, 31, 45, 0, 16, 24, 10, 8, 10, 4, 203, 31, 46, 0, 16, 24, 10, 8, 10, 4, 203, 31, 49, 0, 16, 24, 10, 8, 10, 4, 203, 31, 51, 0, 16, 24, 10, 8, 10, 4, 203, 31, 54, 0, 16, 23, 10, 8, 10, 4, 203, 31, 69, 0, 16, 24, 10, 8, 10, 4, 203, 31, 72, 0, 16, 24, 10, 8, 10, 4, 203, 31, 80, 0, 16, 24, 10, 8, 10, 4, 203, 31, 85, 0, 16, 24, 10, 8, 10, 4, 203, 31, 97, 0, 16, 24, 10, 8, 10, 4, 203, 31, 105, 0, 16, 24, 10, 8, 10, 4, 203, 31, 106, 0, 16, 24, 10, 8, 10, 4, 203, 31, 108, 0, 16, 23, 10, 8, 10, 4, 203, 31, 124, 0, 16, 24, 10, 8, 10, 4, 203, 31, 162, 0, 16, 24, 10, 8, 10, 4, 203, 31, 174, 0, 16, 24, 10, 8, 10, 4, 203, 31, 177, 0, 16, 24, 10, 8, 10, 4, 203, 31, 181, 0, 16, 24, 10, 8, 10, 4, 203, 31, 187, 0, 16, 24, 10, 8, 10, 4, 203, 31, 189, 0, 16, 24, 10, 8, 10, 4, 203, 31, 204, 0, 16, 24, 10, 8, 10, 4, 203, 31, 220, 0, 16, 24, 10, 8, 10, 4, 203, 31, 222, 0, 16, 23, 10, 8, 10, 4, 203, 31, 225, 0, 16, 24, 10, 8, 10, 4, 203, 31, 229, 0, 16, 24, 10, 8, 10, 4, 203, 31, 248, 0, 16, 23, 10, 8, 10, 4, 203, 31, 253, 0, 16, 24, 10, 8, 10, 4, 203, 32, 20, 0, 16, 24, 10, 8, 10, 4, 203, 32, 48, 0, 16, 23, 10, 8, 10, 4, 203, 32, 56, 0, 16, 24, 10, 8, 10, 4, 203, 32, 60, 0, 16, 24, 10, 8, 10, 4, 203, 32, 62, 0, 16, 24, 10, 8, 10, 4, 203, 32, 68, 0, 16, 23, 10, 8, 10, 4, 203, 32, 76, 0, 16, 24, 10, 8, 10, 4, 203, 32, 81, 0, 16, 24, 10, 8, 10, 4, 203, 32, 84, 0, 16, 23, 10, 8, 10, 4, 203, 32, 95, 0, 16, 24, 10, 8, 10, 4, 203, 32, 102, 0, 16, 24, 10, 8, 10, 4, 203, 32, 105, 0, 16, 24, 10, 8, 10, 4, 203, 32, 130, 0, 16, 24, 10, 8, 10, 4, 203, 32, 133, 0, 16, 24, 10, 8, 10, 4, 203, 32, 140, 0, 16, 24, 10, 8, 10, 4, 203, 32, 152, 0, 16, 24, 10, 8, 10, 4, 203, 32, 186, 0, 16, 23, 10, 8, 10, 4, 203, 32, 192, 0, 16, 24, 10, 8, 10, 4, 203, 32, 196, 0, 16, 24, 10, 8, 10, 4, 203, 32, 203, 0, 16, 24, 10, 8, 10, 4, 203, 32, 204, 0, 16, 23, 10, 8, 10, 4, 203, 32, 212, 0, 16, 24, 10, 8, 10, 4, 203, 33, 4, 0, 16, 24, 10, 8, 10, 4, 203, 33, 7, 0, 16, 24, 10, 8, 10, 4, 203, 33, 8, 0, 16, 21, 10, 8, 10, 4, 203, 33, 21, 0, 16, 24, 10, 8, 10, 4, 203, 33, 26, 0, 16, 24, 10, 8, 10, 4, 203, 33, 32, 0, 16, 24, 10, 8, 10, 4, 203, 33, 63, 0, 16, 24, 10, 8, 10, 4, 203, 33, 64, 0, 16, 24, 10, 8, 10, 4, 203, 33, 67, 0, 16, 24, 10, 8, 10, 4, 203, 33, 68, 0, 16, 24, 10, 8, 10, 4, 203, 33, 73, 0, 16, 24, 10, 8, 10, 4, 203, 33, 79, 0, 16, 24, 10, 8, 10, 4, 203, 33, 100, 0, 16, 24, 10, 8, 10, 4, 203, 33, 122, 0, 16, 24, 10, 8, 10, 4, 203, 33, 129, 0, 16, 24, 10, 8, 10, 4, 203, 33, 131, 0, 16, 24, 10, 8, 10, 4, 203, 33, 145, 0, 16, 24, 10, 8, 10, 4, 203, 33, 156, 0, 16, 24, 10, 8, 10, 4, 203, 33, 158, 0, 16, 23, 10, 8, 10, 4, 203, 33, 174, 0, 16, 24, 10, 8, 10, 4, 203, 33, 185, 0, 16, 24, 10, 8, 10, 4, 203, 33, 200, 0, 16, 24, 10, 8, 10, 4, 203, 33, 202, 0, 16, 23, 10, 8, 10, 4, 203, 33, 204, 0, 16, 24, 10, 8, 10, 4, 203, 33, 206, 0, 16, 23, 10, 8, 10, 4, 203, 33, 214, 0, 16, 23, 10, 8, 10, 4, 203, 33, 224, 0, 16, 23, 10, 8, 10, 4, 203, 33, 226, 0, 16, 24, 10, 8, 10, 4, 203, 33, 233, 0, 16, 24, 10, 8, 10, 4, 203, 33, 243, 0, 16, 24, 10, 8, 10, 4, 203, 33, 250, 0, 16, 24, 10, 8, 10, 4, 203, 34, 4, 0, 16, 24, 10, 8, 10, 4, 203, 34, 21, 0, 16, 24, 10, 8, 10, 4, 203, 34, 27, 0, 16, 24, 10, 8, 10, 4, 203, 34, 39, 0, 16, 24, 10, 8, 10, 4, 203, 34, 48, 0, 16, 23, 10, 8, 10, 4, 203, 34, 54, 0, 16, 24, 10, 8, 10, 4, 203, 34, 56, 0, 16, 23, 10, 8, 10, 4, 203, 34, 67, 0, 16, 24, 10, 8, 10, 4, 203, 34, 69, 0, 16, 24, 10, 8, 10, 4, 203, 34, 76, 0, 16, 24, 10, 8, 10, 4, 203, 34, 92, 0, 16, 24, 10, 8, 10, 4, 203, 34, 106, 0, 16, 24, 10, 8, 10, 4, 203, 34, 113, 0, 16, 24, 10, 8, 10, 4, 203, 34, 147, 0, 16, 24, 10, 8, 10, 4, 203, 34, 150, 0, 16, 24, 10, 8, 10, 4, 203, 34, 152, 0, 16, 23, 10, 8, 10, 4, 203, 34, 161, 0, 16, 24, 10, 8, 10, 4, 203, 34, 162, 0, 16, 24, 10, 8, 10, 4, 203, 34, 187, 0, 16, 24, 10, 8, 10, 4, 203, 34, 192, 0, 16, 21, 10, 8, 10, 4, 203, 34, 204, 0, 16, 22, 10, 8, 10, 4, 203, 34, 232, 0, 16, 24, 10, 8, 10, 4, 203, 34, 240, 0, 16, 24, 10, 8, 10, 4, 203, 34, 242, 0, 16, 24, 10, 8, 10, 4, 203, 34, 245, 0, 16, 24, 10, 8, 10, 4, 203, 34, 251, 0, 16, 24, 10, 8, 10, 4, 203, 55, 2, 0, 16, 23, 10, 8, 10, 4, 203, 55, 4, 0, 16, 24, 10, 8, 10, 4, 203, 55, 10, 0, 16, 24, 10, 8, 10, 4, 203, 55, 13, 0, 16, 24, 10, 8, 10, 4, 203, 55, 22, 0, 16, 24, 10, 8, 10, 4, 203, 55, 30, 0, 16, 24, 10, 8, 10, 4, 203, 55, 93, 0, 16, 24, 10, 8, 10, 4, 203, 55, 101, 0, 16, 24, 10, 8, 10, 4, 203, 55, 109, 0, 16, 24, 10, 8, 10, 4, 203, 55, 110, 0, 16, 24, 10, 8, 10, 4, 203, 55, 116, 0, 16, 23, 10, 8, 10, 4, 203, 55, 119, 0, 16, 24, 10, 8, 10, 4, 203, 55, 128, 0, 16, 23, 10, 8, 10, 4, 203, 55, 146, 0, 16, 23, 10, 8, 10, 4, 203, 55, 192, 0, 16, 24, 10, 8, 10, 4, 203, 55, 196, 0, 16, 24, 10, 8, 10, 4, 203, 55, 218, 0, 16, 23, 10, 8, 10, 4, 203, 55, 221, 0, 16, 24, 10, 8, 10, 4, 203, 55, 224, 0, 16, 24, 10, 8, 10, 4, 203, 56, 1, 0, 16, 24, 10, 8, 10, 4, 203, 56, 4, 0, 16, 24, 10, 8, 10, 4, 203, 56, 12, 0, 16, 24, 10, 8, 10, 4, 203, 56, 24, 0, 16, 24, 10, 8, 10, 4, 203, 56, 38, 0, 16, 24, 10, 8, 10, 4, 203, 56, 40, 0, 16, 24, 10, 8, 10, 4, 203, 56, 46, 0, 16, 24, 10, 8, 10, 4, 203, 56, 48, 0, 16, 21, 10, 8, 10, 4, 203, 56, 68, 0, 16, 23, 10, 8, 10, 4, 203, 56, 82, 0, 16, 23, 10, 8, 10, 4, 203, 56, 84, 0, 16, 23, 10, 8, 10, 4, 203, 56, 95, 0, 16, 24, 10, 8, 10, 4, 203, 56, 110, 0, 16, 24, 10, 8, 10, 4, 203, 56, 121, 0, 16, 24, 10, 8, 10, 4, 203, 56, 161, 0, 16, 24, 10, 8, 10, 4, 203, 56, 169, 0, 16, 24, 10, 8, 10, 4, 203, 56, 172, 0, 16, 23, 10, 8, 10, 4, 203, 56, 175, 0, 16, 24, 10, 8, 10, 4, 203, 56, 183, 0, 16, 24, 10, 8, 10, 4, 203, 56, 185, 0, 16, 24, 10, 8, 10, 4, 203, 56, 187, 0, 16, 24, 10, 8, 10, 4, 203, 56, 192, 0, 16, 24, 10, 8, 10, 4, 203, 56, 198, 0, 16, 24, 10, 8, 10, 4, 203, 56, 201, 0, 16, 24, 10, 8, 10, 4, 203, 56, 208, 0, 16, 23, 10, 8, 10, 4, 203, 56, 210, 0, 16, 24, 10, 8, 10, 4, 203, 56, 214, 0, 16, 24, 10, 8, 10, 4, 203, 56, 216, 0, 16, 24, 10, 8, 10, 4, 203, 56, 227, 0, 16, 24, 10, 8, 10, 4, 203, 56, 228, 0, 16, 24, 10, 8, 10, 4, 203, 56, 231, 0, 16, 24, 10, 8, 10, 4, 203, 56, 232, 0, 16, 24, 10, 8, 10, 4, 203, 56, 240, 0, 16, 24, 10, 8, 10, 4, 203, 56, 252, 0, 16, 24, 10, 8, 10, 4, 203, 56, 254, 0, 16, 24, 10, 8, 10, 4, 203, 57, 5, 0, 16, 24, 10, 8, 10, 4, 203, 57, 6, 0, 16, 24, 10, 8, 10, 4, 203, 57, 12, 0, 16, 23, 10, 8, 10, 4, 203, 57, 28, 0, 16, 24, 10, 8, 10, 4, 203, 57, 39, 0, 16, 24, 10, 8, 10, 4, 203, 57, 46, 0, 16, 24, 10, 8, 10, 4, 203, 57, 58, 0, 16, 24, 10, 8, 10, 4, 203, 57, 61, 0, 16, 24, 10, 8, 10, 4, 203, 57, 66, 0, 16, 24, 10, 8, 10, 4, 203, 57, 69, 0, 16, 24, 10, 8, 10, 4, 203, 57, 70, 0, 16, 23, 10, 8, 10, 4, 203, 57, 73, 0, 16, 24, 10, 8, 10, 4, 203, 57, 90, 0, 16, 24, 10, 8, 10, 4, 203, 57, 101, 0, 16, 24, 10, 8, 10, 4, 203, 57, 109, 0, 16, 24, 10, 8, 10, 4, 203, 57, 123, 0, 16, 24, 10, 8, 10, 4, 203, 57, 157, 0, 16, 24, 10, 8, 10, 4, 203, 57, 200, 0, 16, 24, 10, 8, 10, 4, 203, 57, 202, 0, 16, 24, 10, 8, 10, 4, 203, 57, 206, 0, 16, 24, 10, 8, 10, 4, 203, 57, 222, 0, 16, 24, 10, 8, 10, 4, 203, 57, 224, 0, 16, 20, 10, 8, 10, 4, 203, 57, 246, 0, 16, 23, 10, 8, 10, 4, 203, 57, 249, 0, 16, 24, 10, 8, 10, 4, 203, 57, 253, 0, 16, 24, 10, 8, 10, 4, 203, 57, 254, 0, 16, 23, 10, 8, 10, 4, 203, 62, 2, 0, 16, 24, 10, 8, 10, 4, 203, 62, 131, 0, 16, 24, 10, 8, 10, 4, 203, 62, 139, 0, 16, 24, 10, 8, 10, 4, 203, 62, 161, 0, 16, 24, 10, 8, 10, 4, 203, 62, 197, 0, 16, 24, 10, 8, 10, 4, 203, 62, 228, 0, 16, 22, 10, 8, 10, 4, 203, 62, 234, 0, 16, 24, 10, 8, 10, 4, 203, 62, 246, 0, 16, 24, 10, 8, 10, 4, 203, 76, 160, 0, 16, 22, 10, 8, 10, 4, 203, 76, 168, 0, 16, 22, 10, 8, 10, 4, 203, 76, 208, 0, 16, 22, 10, 8, 10, 4, 203, 76, 212, 0, 16, 22, 10, 8, 10, 4, 203, 76, 216, 0, 16, 22, 10, 8, 10, 4, 203, 76, 240, 0, 16, 22, 10, 8, 10, 4, 203, 76, 244, 0, 16, 22, 10, 8, 10, 4, 203, 77, 180, 0, 16, 22, 10, 8, 10, 4, 203, 78, 48, 0, 16, 20, 10, 8, 10, 4, 203, 78, 156, 0, 16, 22, 10, 8, 10, 4, 203, 79, 0, 0, 16, 20, 10, 8, 10, 4, 203, 79, 32, 0, 16, 20, 10, 8, 10, 4, 203, 80, 4, 0, 16, 23, 10, 8, 10, 4, 203, 80, 32, 0, 16, 20, 10, 8, 10, 4, 203, 80, 57, 0, 16, 24, 10, 8, 10, 4, 203, 80, 129, 0, 16, 24, 10, 8, 10, 4, 203, 80, 132, 0, 16, 22, 10, 8, 10, 4, 203, 80, 136, 0, 16, 21, 10, 8, 10, 4, 203, 80, 144, 0, 16, 20, 10, 8, 10, 4, 203, 81, 0, 0, 16, 21, 10, 8, 10, 4, 203, 81, 16, 0, 16, 20, 10, 8, 10, 4, 203, 81, 244, 0, 16, 22, 10, 8, 10, 4, 203, 82, 0, 0, 16, 23, 10, 8, 10, 4, 203, 82, 16, 0, 16, 21, 10, 8, 10, 4, 203, 82, 112, 0, 16, 22, 10, 8, 10, 4, 203, 82, 116, 0, 16, 22, 10, 8, 10, 4, 203, 82, 120, 0, 16, 22, 10, 8, 10, 4, 203, 82, 124, 0, 16, 22, 10, 8, 10, 4, 203, 82, 224, 0, 16, 22, 10, 8, 10, 4, 203, 82, 228, 0, 16, 22, 10, 8, 10, 4, 203, 82, 232, 0, 16, 22, 10, 8, 10, 4, 203, 82, 236, 0, 16, 22, 10, 8, 10, 4, 203, 83, 0, 0, 16, 22, 10, 8, 10, 4, 203, 83, 8, 0, 16, 22, 10, 8, 10, 4, 203, 83, 12, 0, 16, 22, 10, 8, 10, 4, 203, 83, 56, 0, 16, 21, 10, 8, 10, 4, 203, 83, 224, 0, 16, 20, 10, 8, 10, 4, 203, 86, 0, 0, 16, 19, 10, 8, 10, 4, 203, 86, 32, 0, 16, 19, 10, 8, 10, 4, 203, 86, 64, 0, 16, 20, 10, 8, 10, 4, 203, 86, 80, 0, 16, 20, 10, 8, 10, 4, 203, 86, 96, 0, 16, 19, 10, 8, 10, 4, 203, 86, 250, 0, 16, 24, 10, 8, 10, 4, 203, 86, 254, 0, 16, 23, 10, 8, 10, 4, 203, 88, 32, 0, 16, 19, 10, 8, 10, 4, 203, 88, 192, 0, 16, 19, 10, 8, 10, 4, 203, 89, 0, 0, 16, 22, 10, 8, 10, 4, 203, 89, 8, 0, 16, 21, 10, 8, 10, 4, 203, 89, 133, 0, 16, 24, 10, 8, 10, 4, 203, 89, 136, 0, 16, 22, 10, 8, 10, 4, 203, 89, 144, 0, 16, 24, 10, 8, 10, 4, 203, 90, 0, 0, 16, 22, 10, 8, 10, 4, 203, 90, 8, 0, 16, 22, 10, 8, 10, 4, 203, 90, 12, 0, 16, 22, 10, 8, 10, 4, 203, 90, 128, 0, 16, 19, 10, 8, 10, 4, 203, 90, 160, 0, 16, 19, 10, 8, 10, 4, 203, 90, 192, 0, 16, 19, 10, 8, 10, 4, 203, 91, 32, 0, 16, 19, 10, 8, 10, 4, 203, 91, 96, 0, 16, 20, 10, 8, 10, 4, 203, 91, 120, 0, 16, 21, 10, 8, 10, 4, 203, 92, 0, 0, 16, 22, 10, 8, 10, 4, 203, 92, 6, 0, 16, 24, 10, 8, 10, 4, 203, 92, 160, 0, 16, 19, 10, 8, 10, 4, 203, 93, 0, 0, 16, 22, 10, 8, 10, 4, 203, 93, 4, 0, 16, 22, 10, 8, 10, 4, 203, 93, 8, 0, 16, 24, 10, 8, 10, 4, 203, 93, 9, 0, 16, 24, 10, 8, 10, 4, 203, 93, 10, 0, 16, 23, 10, 8, 10, 4, 203, 93, 12, 0, 16, 22, 10, 8, 10, 4, 203, 93, 16, 0, 16, 20, 10, 8, 10, 4, 203, 93, 32, 0, 16, 19, 10, 8, 10, 4, 203, 93, 64, 0, 16, 18, 10, 8, 10, 4, 203, 93, 128, 0, 16, 21, 10, 8, 10, 4, 203, 93, 136, 0, 16, 22, 10, 8, 10, 4, 203, 93, 140, 0, 16, 24, 10, 8, 10, 4, 203, 93, 141, 0, 16, 24, 10, 8, 10, 4, 203, 93, 142, 0, 16, 23, 10, 8, 10, 4, 203, 93, 144, 0, 16, 20, 10, 8, 10, 4, 203, 93, 160, 0, 16, 19, 10, 8, 10, 4, 203, 93, 192, 0, 16, 18, 10, 8, 10, 4, 203, 94, 0, 0, 16, 22, 10, 8, 10, 4, 203, 94, 4, 0, 16, 22, 10, 8, 10, 4, 203, 94, 8, 0, 16, 21, 10, 8, 10, 4, 203, 94, 16, 0, 16, 20, 10, 8, 10, 4, 203, 95, 0, 0, 16, 21, 10, 8, 10, 4, 203, 95, 96, 0, 16, 20, 10, 8, 10, 4, 203, 95, 112, 0, 16, 20, 10, 8, 10, 4, 203, 95, 128, 0, 16, 18, 10, 8, 10, 4, 203, 95, 200, 0, 16, 22, 10, 8, 10, 4, 203, 95, 204, 0, 16, 22, 10, 8, 10, 4, 203, 95, 208, 0, 16, 22, 10, 8, 10, 4, 203, 95, 224, 0, 16, 19, 10, 8, 10, 4, 203, 99, 8, 0, 16, 21, 10, 8, 10, 4, 203, 99, 16, 0, 16, 20, 10, 8, 10, 4, 203, 99, 80, 0, 16, 20, 10, 8, 10, 4, 203, 100, 32, 0, 16, 20, 10, 8, 10, 4, 203, 100, 48, 0, 16, 21, 10, 8, 10, 4, 203, 100, 58, 0, 16, 24, 10, 8, 10, 4, 203, 100, 60, 0, 16, 24, 10, 8, 10, 4, 203, 100, 63, 0, 16, 24, 10, 8, 10, 4, 203, 100, 80, 0, 16, 20, 10, 8, 10, 4, 203, 100, 96, 0, 16, 19, 10, 8, 10, 4, 203, 100, 192, 0, 16, 20, 10, 8, 10, 4, 203, 104, 32, 0, 16, 20, 10, 8, 10, 4, 203, 105, 96, 0, 16, 19, 10, 8, 10, 4, 203, 105, 128, 0, 16, 19, 10, 8, 10, 4, 203, 107, 0, 0, 16, 17, 10, 8, 10, 4, 203, 110, 160, 0, 16, 19, 10, 8, 10, 4, 203, 110, 208, 0, 16, 20, 10, 8, 10, 4, 203, 110, 232, 0, 16, 23, 10, 8, 10, 4, 203, 110, 234, 0, 16, 24, 10, 8, 10, 4, 203, 114, 80, 0, 16, 22, 10, 8, 10, 4, 203, 114, 84, 0, 16, 22, 10, 8, 10, 4, 203, 114, 88, 0, 16, 22, 10, 8, 10, 4, 203, 114, 92, 0, 16, 22, 10, 8, 10, 4, 203, 114, 244, 0, 16, 22, 10, 8, 10, 4, 203, 118, 192, 0, 16, 19, 10, 8, 10, 4, 203, 118, 241, 0, 16, 24, 10, 8, 10, 4, 203, 118, 248, 0, 16, 22, 10, 8, 10, 4, 203, 119, 24, 0, 16, 21, 10, 8, 10, 4, 203, 119, 32, 0, 16, 22, 10, 8, 10, 4, 203, 119, 80, 0, 16, 22, 10, 8, 10, 4, 203, 119, 85, 0, 16, 24, 10, 8, 10, 4, 203, 119, 113, 0, 16, 24, 10, 8, 10, 4, 203, 119, 114, 0, 16, 23, 10, 8, 10, 4, 203, 119, 116, 0, 16, 22, 10, 8, 10, 4, 203, 119, 120, 0, 16, 21, 10, 8, 10, 4, 203, 119, 128, 0, 16, 17, 10, 8, 10, 4, 203, 123, 58, 0, 16, 24, 10, 8, 10, 4, 203, 128, 32, 0, 16, 19, 10, 8, 10, 4, 203, 128, 96, 0, 16, 19, 10, 8, 10, 4, 203, 128, 224, 0, 16, 21, 10, 8, 10, 4, 203, 129, 8, 0, 16, 21, 10, 8, 10, 4, 203, 130, 32, 0, 16, 19, 10, 8, 10, 4, 203, 132, 32, 0, 16, 19, 10, 8, 10, 4, 203, 134, 240, 0, 16, 21, 10, 8, 10, 4, 203, 135, 96, 0, 16, 20, 10, 8, 10, 4, 203, 135, 112, 0, 16, 20, 10, 8, 10, 4, 203, 135, 160, 0, 16, 20, 10, 8, 10, 4, 203, 142, 219, 0, 16, 24, 10, 8, 10, 4, 203, 142, 224, 0, 16, 19, 10, 8, 10, 4, 203, 144, 96, 0, 16, 19, 10, 8, 10, 4, 203, 145, 0, 0, 16, 19, 10, 8, 10, 4, 203, 148, 0, 0, 16, 18, 10, 8, 10, 4, 203, 148, 64, 0, 16, 20, 10, 8, 10, 4, 203, 148, 80, 0, 16, 22, 10, 8, 10, 4, 203, 148, 86, 0, 16, 23, 10, 8, 10, 4, 203, 149, 92, 0, 16, 22, 10, 8, 10, 4, 203, 152, 64, 0, 16, 19, 10, 8, 10, 4, 203, 152, 128, 0, 16, 19, 10, 8, 10, 4, 203, 153, 0, 0, 16, 22, 10, 8, 10, 4, 203, 156, 192, 0, 16, 18, 10, 8, 10, 4, 203, 158, 16, 0, 16, 21, 10, 8, 10, 4, 203, 160, 52, 0, 16, 22, 10, 8, 10, 4, 203, 160, 104, 0, 16, 21, 10, 8, 10, 4, 203, 160, 129, 0, 16, 24, 10, 8, 10, 4, 203, 160, 192, 0, 16, 19, 10, 8, 10, 4, 203, 161, 0, 0, 16, 22, 10, 8, 10, 4, 203, 161, 180, 0, 16, 24, 10, 8, 10, 4, 203, 161, 183, 0, 16, 24, 10, 8, 10, 4, 203, 161, 192, 0, 16, 19, 10, 8, 10, 4, 203, 166, 160, 0, 16, 19, 10, 8, 10, 4, 203, 167, 28, 0, 16, 22, 10, 8, 10, 4, 203, 168, 0, 0, 16, 19, 10, 8, 10, 4, 203, 170, 58, 0, 16, 23, 10, 8, 10, 4, 203, 171, 0, 0, 16, 22, 10, 8, 10, 4, 203, 171, 208, 0, 16, 24, 10, 8, 10, 4, 203, 171, 224, 0, 16, 20, 10, 8, 10, 4, 203, 174, 4, 0, 16, 24, 10, 8, 10, 4, 203, 174, 6, 0, 16, 24, 10, 8, 10, 4, 203, 174, 7, 0, 16, 24, 10, 8, 10, 4, 203, 174, 96, 0, 16, 19, 10, 8, 10, 4, 203, 175, 128, 0, 16, 19, 10, 8, 10, 4, 203, 175, 192, 0, 16, 18, 10, 8, 10, 4, 203, 176, 0, 0, 16, 18, 10, 8, 10, 4, 203, 176, 64, 0, 16, 19, 10, 8, 10, 4, 203, 176, 168, 0, 16, 21, 10, 8, 10, 4, 203, 184, 80, 0, 16, 20, 10, 8, 10, 4, 203, 185, 189, 0, 16, 24, 10, 8, 10, 4, 203, 187, 160, 0, 16, 19, 10, 8, 10, 4, 203, 189, 0, 0, 16, 23, 10, 8, 10, 4, 203, 189, 6, 0, 16, 23, 10, 8, 10, 4, 203, 189, 112, 0, 16, 22, 10, 8, 10, 4, 203, 189, 192, 0, 16, 19, 10, 8, 10, 4, 203, 189, 232, 0, 16, 22, 10, 8, 10, 4, 203, 189, 236, 0, 16, 22, 10, 8, 10, 4, 203, 189, 240, 0, 16, 22, 10, 8, 10, 4, 203, 190, 96, 0, 16, 20, 10, 8, 10, 4, 203, 190, 249, 0, 16, 24, 10, 8, 10, 4, 203, 191, 0, 0, 16, 23, 10, 8, 10, 4, 203, 191, 2, 0, 16, 24, 10, 8, 10, 4, 203, 191, 5, 0, 16, 24, 10, 8, 10, 4, 203, 191, 7, 0, 16, 24, 10, 8, 10, 4, 203, 191, 16, 0, 16, 20, 10, 8, 10, 4, 203, 191, 64, 0, 16, 18, 10, 8, 10, 4, 203, 191, 133, 0, 16, 24, 10, 8, 10, 4, 203, 191, 144, 0, 16, 21, 10, 8, 10, 4, 203, 191, 152, 0, 16, 21, 10, 8, 10, 4, 203, 192, 0, 0, 16, 19, 10, 8, 10, 4, 203, 193, 224, 0, 16, 19, 10, 8, 10, 4, 203, 194, 120, 0, 16, 21, 10, 8, 10, 4, 203, 195, 64, 0, 16, 19, 10, 8, 10, 4, 203, 195, 112, 0, 16, 21, 10, 8, 10, 4, 203, 195, 128, 0, 16, 17, 10, 8, 10, 4, 203, 196, 0, 0, 16, 21, 10, 8, 10, 4, 203, 196, 8, 0, 16, 21, 10, 8, 10, 4, 203, 196, 28, 0, 16, 22, 10, 8, 10, 4, 203, 201, 181, 0, 16, 24, 10, 8, 10, 4, 203, 201, 182, 0, 16, 24, 10, 8, 10, 4, 203, 202, 236, 0, 16, 22, 10, 8, 10, 4, 203, 205, 64, 0, 16, 19, 10, 8, 10, 4, 203, 205, 128, 0, 16, 17, 10, 8, 10, 4, 203, 207, 64, 0, 16, 20, 10, 8, 10, 4, 203, 207, 80, 0, 16, 21, 10, 8, 10, 4, 203, 207, 88, 0, 16, 22, 10, 8, 10, 4, 203, 207, 92, 0, 16, 22, 10, 8, 10, 4, 203, 207, 96, 0, 16, 20, 10, 8, 10, 4, 203, 207, 112, 0, 16, 20, 10, 8, 10, 4, 203, 207, 128, 0, 16, 18, 10, 8, 10, 4, 203, 207, 192, 0, 16, 21, 10, 8, 10, 4, 203, 207, 200, 0, 16, 21, 10, 8, 10, 4, 203, 207, 208, 0, 16, 20, 10, 8, 10, 4, 203, 207, 224, 0, 16, 19, 10, 8, 10, 4, 203, 208, 0, 0, 16, 20, 10, 8, 10, 4, 203, 208, 16, 0, 16, 22, 10, 8, 10, 4, 203, 208, 32, 0, 16, 19, 10, 8, 10, 4, 203, 209, 224, 0, 16, 19, 10, 8, 10, 4, 203, 212, 0, 0, 16, 20, 10, 8, 10, 4, 203, 212, 80, 0, 16, 20, 10, 8, 10, 4, 203, 215, 232, 0, 16, 21, 10, 8, 10, 4, 203, 217, 164, 0, 16, 22, 10, 8, 10, 4, 203, 222, 192, 0, 16, 20, 10, 8, 10, 4, 203, 223, 0, 0, 16, 20, 10, 8, 10, 4, 203, 223, 16, 0, 16, 21, 10, 8, 10, 4, 210, 2, 0, 0, 16, 20, 10, 8, 10, 4, 210, 2, 16, 0, 16, 20, 10, 8, 10, 4, 210, 5, 0, 0, 16, 19, 10, 8, 10, 4, 210, 5, 56, 0, 16, 21, 10, 8, 10, 4, 210, 5, 128, 0, 16, 20, 10, 8, 10, 4, 210, 5, 144, 0, 16, 20, 10, 8, 10, 4, 210, 7, 56, 0, 16, 22, 10, 8, 10, 4, 210, 7, 60, 0, 16, 22, 10, 8, 10, 4, 210, 12, 0, 0, 16, 18, 10, 8, 10, 4, 210, 12, 64, 0, 16, 18, 10, 8, 10, 4, 210, 12, 128, 0, 16, 18, 10, 8, 10, 4, 210, 12, 192, 0, 16, 18, 10, 8, 10, 4, 210, 13, 0, 0, 16, 18, 10, 8, 10, 4, 210, 13, 64, 0, 16, 18, 10, 8, 10, 4, 210, 13, 128, 0, 16, 17, 10, 8, 10, 4, 210, 14, 64, 0, 16, 19, 10, 8, 10, 4, 210, 14, 112, 0, 16, 20, 10, 8, 10, 4, 210, 14, 128, 0, 16, 19, 10, 8, 10, 4, 210, 14, 160, 0, 16, 19, 10, 8, 10, 4, 210, 14, 192, 0, 16, 19, 10, 8, 10, 4, 210, 14, 224, 0, 16, 19, 10, 8, 10, 4, 210, 15, 0, 0, 16, 19, 10, 8, 10, 4, 210, 15, 32, 0, 16, 19, 10, 8, 10, 4, 210, 15, 64, 0, 16, 19, 10, 8, 10, 4, 210, 15, 96, 0, 16, 19, 10, 8, 10, 4, 210, 15, 128, 0, 16, 18, 10, 8, 10, 4, 210, 16, 104, 0, 16, 22, 10, 8, 10, 4, 210, 16, 128, 0, 16, 18, 10, 8, 10, 4, 210, 21, 0, 0, 16, 17, 10, 8, 10, 4, 210, 21, 128, 0, 16, 17, 10, 8, 10, 4, 210, 22, 0, 0, 16, 16, 10, 8, 10, 4, 210, 23, 32, 0, 16, 19, 10, 8, 10, 4, 210, 25, 0, 0, 16, 16, 10, 8, 10, 4, 210, 26, 0, 0, 16, 15, 10, 8, 10, 4, 210, 28, 0, 0, 16, 14, 10, 8, 10, 4, 210, 32, 0, 0, 16, 14, 10, 8, 10, 4, 210, 36, 0, 0, 16, 14, 10, 8, 10, 4, 210, 40, 0, 0, 16, 13, 10, 8, 10, 4, 210, 51, 0, 0, 16, 16, 10, 8, 10, 4, 210, 52, 0, 0, 16, 18, 10, 8, 10, 4, 210, 52, 64, 0, 16, 18, 10, 8, 10, 4, 210, 52, 128, 0, 16, 17, 10, 8, 10, 4, 210, 53, 0, 0, 16, 17, 10, 8, 10, 4, 210, 53, 128, 0, 16, 17, 10, 8, 10, 4, 210, 56, 192, 0, 16, 19, 10, 8, 10, 4, 210, 72, 0, 0, 16, 17, 10, 8, 10, 4, 210, 72, 128, 0, 16, 19, 10, 8, 10, 4, 210, 72, 160, 0, 16, 19, 10, 8, 10, 4, 210, 72, 192, 0, 16, 18, 10, 8, 10, 4, 210, 73, 0, 0, 16, 19, 10, 8, 10, 4, 210, 73, 32, 0, 16, 19, 10, 8, 10, 4, 210, 73, 64, 0, 16, 18, 10, 8, 10, 4, 210, 73, 128, 0, 16, 17, 10, 8, 10, 4, 210, 74, 0, 0, 16, 19, 10, 8, 10, 4, 210, 74, 32, 0, 16, 19, 10, 8, 10, 4, 210, 74, 64, 0, 16, 19, 10, 8, 10, 4, 210, 74, 96, 0, 16, 19, 10, 8, 10, 4, 210, 74, 128, 0, 16, 19, 10, 8, 10, 4, 210, 74, 160, 0, 16, 19, 10, 8, 10, 4, 210, 74, 192, 0, 16, 18, 10, 8, 10, 4, 210, 75, 0, 0, 16, 16, 10, 8, 10, 4, 210, 76, 0, 0, 16, 19, 10, 8, 10, 4, 210, 76, 32, 0, 16, 19, 10, 8, 10, 4, 210, 76, 64, 0, 16, 18, 10, 8, 10, 4, 210, 76, 128, 0, 16, 17, 10, 8, 10, 4, 210, 77, 0, 0, 16, 16, 10, 8, 10, 4, 210, 78, 0, 0, 16, 19, 10, 8, 10, 4, 210, 78, 32, 0, 16, 19, 10, 8, 10, 4, 210, 78, 64, 0, 16, 18, 10, 8, 10, 4, 210, 78, 128, 0, 16, 19, 10, 8, 10, 4, 210, 78, 160, 0, 16, 19, 10, 8, 10, 4, 210, 78, 192, 0, 16, 18, 10, 8, 10, 4, 210, 79, 64, 0, 16, 18, 10, 8, 10, 4, 210, 79, 224, 0, 16, 19, 10, 8, 10, 4, 210, 82, 0, 0, 16, 15, 10, 8, 10, 4, 210, 87, 128, 0, 16, 20, 10, 8, 10, 4, 210, 87, 144, 0, 16, 20, 10, 8, 10, 4, 210, 87, 160, 0, 16, 19, 10, 8, 10, 4, 210, 185, 192, 0, 16, 18, 10, 8, 10, 4, 210, 192, 96, 0, 16, 19, 10, 8, 10, 4, 211, 64, 0, 0, 16, 14, 10, 8, 10, 4, 211, 68, 0, 0, 16, 15, 10, 8, 10, 4, 211, 70, 0, 0, 16, 15, 10, 8, 10, 4, 211, 80, 0, 0, 16, 16, 10, 8, 10, 4, 211, 81, 0, 0, 16, 16, 10, 8, 10, 4, 211, 82, 0, 0, 16, 16, 10, 8, 10, 4, 211, 83, 0, 0, 16, 16, 10, 8, 10, 4, 211, 84, 0, 0, 16, 15, 10, 8, 10, 4, 211, 86, 0, 0, 16, 15, 10, 8, 10, 4, 211, 88, 0, 0, 16, 16, 10, 8, 10, 4, 211, 89, 0, 0, 16, 16, 10, 8, 10, 4, 211, 90, 0, 0, 16, 15, 10, 8, 10, 4, 211, 92, 0, 0, 16, 15, 10, 8, 10, 4, 211, 94, 0, 0, 16, 15, 10, 8, 10, 4, 211, 96, 0, 0, 16, 15, 10, 8, 10, 4, 211, 98, 0, 0, 16, 16, 10, 8, 10, 4, 211, 99, 0, 0, 16, 18, 10, 8, 10, 4, 211, 99, 64, 0, 16, 19, 10, 8, 10, 4, 211, 99, 96, 0, 16, 19, 10, 8, 10, 4, 211, 99, 128, 0, 16, 17, 10, 8, 10, 4, 211, 100, 0, 0, 16, 16, 10, 8, 10, 4, 211, 101, 0, 0, 16, 18, 10, 8, 10, 4, 211, 101, 64, 0, 16, 18, 10, 8, 10, 4, 211, 101, 128, 0, 16, 17, 10, 8, 10, 4, 211, 102, 0, 0, 16, 16, 10, 8, 10, 4, 211, 103, 0, 0, 16, 17, 10, 8, 10, 4, 211, 103, 128, 0, 16, 17, 10, 8, 10, 4, 211, 136, 0, 0, 16, 14, 10, 8, 10, 4, 211, 140, 0, 0, 16, 15, 10, 8, 10, 4, 211, 142, 0, 0, 16, 17, 10, 8, 10, 4, 211, 142, 128, 0, 16, 17, 10, 8, 10, 4, 211, 143, 0, 0, 16, 16, 10, 8, 10, 4, 211, 144, 0, 0, 16, 15, 10, 8, 10, 4, 211, 146, 0, 0, 16, 16, 10, 8, 10, 4, 211, 147, 0, 0, 16, 16, 10, 8, 10, 4, 211, 148, 0, 0, 16, 14, 10, 8, 10, 4, 211, 152, 0, 0, 16, 15, 10, 8, 10, 4, 211, 154, 0, 0, 16, 16, 10, 8, 10, 4, 211, 155, 0, 0, 16, 18, 10, 8, 10, 4, 211, 155, 64, 0, 16, 19, 10, 8, 10, 4, 211, 155, 96, 0, 16, 19, 10, 8, 10, 4, 211, 155, 128, 0, 16, 17, 10, 8, 10, 4, 211, 156, 0, 0, 16, 14, 10, 8, 10, 4, 211, 160, 0, 0, 16, 14, 10, 8, 10, 4, 211, 164, 0, 0, 16, 14, 10, 8, 10, 4, 212, 64, 0, 0, 16, 17, 10, 8, 10, 4, 212, 129, 128, 0, 16, 17, 10, 8, 10, 4, 216, 250, 108, 0, 16, 22, 10, 8, 10, 4, 218, 0, 0, 0, 16, 16, 10, 8, 10, 4, 218, 1, 0, 0, 16, 16, 10, 8, 10, 4, 218, 2, 0, 0, 16, 15, 10, 8, 10, 4, 218, 4, 0, 0, 16, 15, 10, 8, 10, 4, 218, 6, 0, 0, 16, 16, 10, 8, 10, 4, 218, 7, 0, 0, 16, 16, 10, 8, 10, 4, 218, 8, 0, 0, 16, 15, 10, 8, 10, 4, 218, 10, 0, 0, 16, 16, 10, 8, 10, 4, 218, 11, 0, 0, 16, 16, 10, 8, 10, 4, 218, 12, 0, 0, 16, 16, 10, 8, 10, 4, 218, 13, 0, 0, 16, 16, 10, 8, 10, 4, 218, 14, 0, 0, 16, 15, 10, 8, 10, 4, 218, 16, 0, 0, 16, 14, 10, 8, 10, 4, 218, 20, 0, 0, 16, 16, 10, 8, 10, 4, 218, 21, 0, 0, 16, 17, 10, 8, 10, 4, 218, 21, 128, 0, 16, 17, 10, 8, 10, 4, 218, 22, 0, 0, 16, 15, 10, 8, 10, 4, 218, 24, 0, 0, 16, 15, 10, 8, 10, 4, 218, 26, 0, 0, 16, 16, 10, 8, 10, 4, 218, 27, 0, 0, 16, 16, 10, 8, 10, 4, 218, 28, 0, 0, 16, 15, 10, 8, 10, 4, 218, 30, 0, 0, 16, 15, 10, 8, 10, 4, 218, 56, 0, 0, 16, 14, 10, 8, 10, 4, 218, 60, 0, 0, 16, 15, 10, 8, 10, 4, 218, 62, 0, 0, 16, 17, 10, 8, 10, 4, 218, 62, 128, 0, 16, 17, 10, 8, 10, 4, 218, 63, 0, 0, 16, 16, 10, 8, 10, 4, 218, 64, 0, 0, 16, 15, 10, 8, 10, 4, 218, 66, 0, 0, 16, 16, 10, 8, 10, 4, 218, 67, 0, 0, 16, 17, 10, 8, 10, 4, 218, 67, 128, 0, 16, 17, 10, 8, 10, 4, 218, 68, 0, 0, 16, 15, 10, 8, 10, 4, 218, 70, 0, 0, 16, 15, 10, 8, 10, 4, 218, 72, 0, 0, 16, 14, 10, 8, 10, 4, 218, 76, 0, 0, 16, 15, 10, 8, 10, 4, 218, 78, 0, 0, 16, 15, 10, 8, 10, 4, 218, 80, 0, 0, 16, 14, 10, 8, 10, 4, 218, 84, 0, 0, 16, 14, 10, 8, 10, 4, 218, 88, 0, 0, 16, 13, 10, 8, 10, 4, 218, 96, 0, 0, 16, 15, 10, 8, 10, 4, 218, 98, 0, 0, 16, 17, 10, 8, 10, 4, 218, 98, 128, 0, 16, 18, 10, 8, 10, 4, 218, 98, 192, 0, 16, 19, 10, 8, 10, 4, 218, 98, 224, 0, 16, 19, 10, 8, 10, 4, 218, 99, 0, 0, 16, 16, 10, 8, 10, 4, 218, 100, 88, 0, 16, 21, 10, 8, 10, 4, 218, 100, 96, 0, 16, 19, 10, 8, 10, 4, 218, 100, 128, 0, 16, 17, 10, 8, 10, 4, 218, 104, 0, 0, 16, 17, 10, 8, 10, 4, 218, 104, 128, 0, 16, 19, 10, 8, 10, 4, 218, 104, 160, 0, 16, 19, 10, 8, 10, 4, 218, 104, 192, 0, 16, 21, 10, 8, 10, 4, 218, 104, 200, 0, 16, 21, 10, 8, 10, 4, 218, 104, 208, 0, 16, 20, 10, 8, 10, 4, 218, 104, 224, 0, 16, 19, 10, 8, 10, 4, 218, 105, 0, 0, 16, 16, 10, 8, 10, 4, 218, 106, 0, 0, 16, 15, 10, 8, 10, 4, 218, 108, 0, 0, 16, 16, 10, 8, 10, 4, 218, 109, 0, 0, 16, 16, 10, 8, 10, 4, 218, 185, 192, 0, 16, 19, 10, 8, 10, 4, 218, 185, 240, 0, 16, 21, 10, 8, 10, 4, 218, 192, 0, 0, 16, 16, 10, 8, 10, 4, 218, 193, 0, 0, 16, 16, 10, 8, 10, 4, 218, 194, 0, 0, 16, 16, 10, 8, 10, 4, 218, 195, 0, 0, 16, 16, 10, 8, 10, 4, 218, 196, 0, 0, 16, 14, 10, 8, 10, 4, 218, 200, 0, 0, 16, 14, 10, 8, 10, 4, 218, 204, 0, 0, 16, 15, 10, 8, 10, 4, 218, 206, 0, 0, 16, 15, 10, 8, 10, 4, 218, 240, 0, 0, 16, 14, 10, 8, 10, 4, 218, 244, 0, 0, 16, 15, 10, 8, 10, 4, 218, 246, 0, 0, 16, 15, 10, 8, 10, 4, 218, 249, 0, 0, 16, 16, 10, 8, 10, 4, 219, 72, 0, 0, 16, 16, 10, 8, 10, 4, 219, 82, 0, 0, 16, 16, 10, 8, 10, 4, 219, 83, 128, 0, 16, 17, 10, 8, 10, 4, 219, 90, 68, 0, 16, 22, 10, 8, 10, 4, 219, 90, 72, 0, 16, 22, 10, 8, 10, 4, 219, 90, 76, 0, 16, 22, 10, 8, 10, 4, 219, 128, 0, 0, 16, 12, 10, 8, 10, 4, 219, 144, 0, 0, 16, 14, 10, 8, 10, 4, 219, 148, 0, 0, 16, 16, 10, 8, 10, 4, 219, 149, 0, 0, 16, 17, 10, 8, 10, 4, 219, 149, 128, 0, 16, 18, 10, 8, 10, 4, 219, 149, 192, 0, 16, 18, 10, 8, 10, 4, 219, 150, 0, 0, 16, 19, 10, 8, 10, 4, 219, 150, 32, 0, 16, 19, 10, 8, 10, 4, 219, 150, 64, 0, 16, 19, 10, 8, 10, 4, 219, 150, 96, 0, 16, 20, 10, 8, 10, 4, 219, 150, 112, 0, 16, 20, 10, 8, 10, 4, 219, 150, 128, 0, 16, 17, 10, 8, 10, 4, 219, 151, 0, 0, 16, 19, 10, 8, 10, 4, 219, 151, 32, 0, 16, 19, 10, 8, 10, 4, 219, 151, 64, 0, 16, 18, 10, 8, 10, 4, 219, 151, 128, 0, 16, 17, 10, 8, 10, 4, 219, 152, 0, 0, 16, 15, 10, 8, 10, 4, 219, 154, 0, 0, 16, 15, 10, 8, 10, 4, 219, 156, 0, 0, 16, 15, 10, 8, 10, 4, 219, 158, 0, 0, 16, 17, 10, 8, 10, 4, 219, 158, 128, 0, 16, 17, 10, 8, 10, 4, 219, 159, 0, 0, 16, 18, 10, 8, 10, 4, 219, 159, 64, 0, 16, 18, 10, 8, 10, 4, 219, 159, 128, 0, 16, 17, 10, 8, 10, 4, 219, 216, 0, 0, 16, 15, 10, 8, 10, 4, 219, 218, 0, 0, 16, 15, 10, 8, 10, 4, 219, 220, 0, 0, 16, 16, 10, 8, 10, 4, 219, 221, 0, 0, 16, 16, 10, 8, 10, 4, 219, 222, 0, 0, 16, 15, 10, 8, 10, 4, 219, 224, 0, 0, 16, 15, 10, 8, 10, 4, 219, 226, 0, 0, 16, 16, 10, 8, 10, 4, 219, 227, 0, 0, 16, 16, 10, 8, 10, 4, 219, 228, 0, 0, 16, 15, 10, 8, 10, 4, 219, 230, 0, 0, 16, 15, 10, 8, 10, 4, 219, 232, 0, 0, 16, 14, 10, 8, 10, 4, 219, 236, 0, 0, 16, 15, 10, 8, 10, 4, 219, 238, 0, 0, 16, 15, 10, 8, 10, 4, 219, 242, 0, 0, 16, 15, 10, 8, 10, 4, 219, 244, 0, 0, 16, 14, 10, 8, 10, 4, 220, 101, 192, 0, 16, 18, 10, 8, 10, 4, 220, 112, 0, 0, 16, 14, 10, 8, 10, 4, 220, 152, 128, 0, 16, 17, 10, 8, 10, 4, 220, 154, 0, 0, 16, 15, 10, 8, 10, 4, 220, 158, 240, 0, 16, 22, 10, 8, 10, 4, 220, 160, 0, 0, 16, 11, 10, 8, 10, 4, 220, 192, 0, 0, 16, 15, 10, 8, 10, 4, 220, 194, 0, 0, 16, 15, 10, 8, 10, 4, 220, 196, 0, 0, 16, 14, 10, 8, 10, 4, 220, 200, 0, 0, 16, 13, 10, 8, 10, 4, 220, 231, 0, 0, 16, 18, 10, 8, 10, 4, 220, 231, 128, 0, 16, 17, 10, 8, 10, 4, 220, 232, 64, 0, 16, 18, 10, 8, 10, 4, 220, 234, 0, 0, 16, 16, 10, 8, 10, 4, 220, 242, 0, 0, 16, 15, 10, 8, 10, 4, 220, 247, 136, 0, 16, 21, 10, 8, 10, 4, 220, 248, 0, 0, 16, 14, 10, 8, 10, 4, 220, 252, 0, 0, 16, 16, 10, 8, 10, 4, 221, 0, 0, 0, 16, 15, 10, 8, 10, 4, 221, 2, 0, 0, 16, 16, 10, 8, 10, 4, 221, 3, 0, 0, 16, 17, 10, 8, 10, 4, 221, 3, 128, 0, 16, 17, 10, 8, 10, 4, 221, 4, 0, 0, 16, 16, 10, 8, 10, 4, 221, 5, 0, 0, 16, 17, 10, 8, 10, 4, 221, 5, 128, 0, 16, 17, 10, 8, 10, 4, 221, 6, 0, 0, 16, 16, 10, 8, 10, 4, 221, 7, 0, 0, 16, 19, 10, 8, 10, 4, 221, 7, 32, 0, 16, 19, 10, 8, 10, 4, 221, 7, 64, 0, 16, 19, 10, 8, 10, 4, 221, 7, 96, 0, 16, 19, 10, 8, 10, 4, 221, 7, 128, 0, 16, 17, 10, 8, 10, 4, 221, 8, 0, 0, 16, 15, 10, 8, 10, 4, 221, 10, 0, 0, 16, 16, 10, 8, 10, 4, 221, 11, 0, 0, 16, 17, 10, 8, 10, 4, 221, 11, 128, 0, 16, 18, 10, 8, 10, 4, 221, 11, 192, 0, 16, 19, 10, 8, 10, 4, 221, 11, 224, 0, 16, 19, 10, 8, 10, 4, 221, 12, 0, 0, 16, 17, 10, 8, 10, 4, 221, 12, 128, 0, 16, 18, 10, 8, 10, 4, 221, 13, 0, 0, 16, 18, 10, 8, 10, 4, 221, 13, 64, 0, 16, 19, 10, 8, 10, 4, 221, 13, 96, 0, 16, 19, 10, 8, 10, 4, 221, 13, 128, 0, 16, 17, 10, 8, 10, 4, 221, 14, 0, 0, 16, 15, 10, 8, 10, 4, 221, 122, 0, 0, 16, 15, 10, 8, 10, 4, 221, 128, 128, 0, 16, 17, 10, 8, 10, 4, 221, 129, 0, 0, 16, 16, 10, 8, 10, 4, 221, 130, 0, 0, 16, 15, 10, 8, 10, 4, 221, 133, 224, 0, 16, 19, 10, 8, 10, 4, 221, 136, 0, 0, 16, 16, 10, 8, 10, 4, 221, 137, 0, 0, 16, 16, 10, 8, 10, 4, 221, 172, 0, 0, 16, 14, 10, 8, 10, 4, 221, 176, 0, 0, 16, 13, 10, 8, 10, 4, 221, 192, 0, 0, 16, 15, 10, 8, 10, 4, 221, 194, 0, 0, 16, 16, 10, 8, 10, 4, 221, 195, 0, 0, 16, 16, 10, 8, 10, 4, 221, 196, 0, 0, 16, 15, 10, 8, 10, 4, 221, 198, 0, 0, 16, 16, 10, 8, 10, 4, 221, 199, 0, 0, 16, 19, 10, 8, 10, 4, 221, 199, 32, 0, 16, 20, 10, 8, 10, 4, 221, 199, 48, 0, 16, 20, 10, 8, 10, 4, 221, 199, 64, 0, 16, 18, 10, 8, 10, 4, 221, 199, 128, 0, 16, 18, 10, 8, 10, 4, 221, 199, 192, 0, 16, 20, 10, 8, 10, 4, 221, 199, 224, 0, 16, 19, 10, 8, 10, 4, 221, 200, 0, 0, 16, 14, 10, 8, 10, 4, 221, 204, 0, 0, 16, 15, 10, 8, 10, 4, 221, 206, 0, 0, 16, 16, 10, 8, 10, 4, 221, 207, 0, 0, 16, 18, 10, 8, 10, 4, 221, 207, 64, 0, 16, 18, 10, 8, 10, 4, 221, 207, 128, 0, 16, 17, 10, 8, 10, 4, 221, 208, 0, 0, 16, 14, 10, 8, 10, 4, 221, 212, 0, 0, 16, 16, 10, 8, 10, 4, 221, 213, 0, 0, 16, 16, 10, 8, 10, 4, 221, 214, 0, 0, 16, 15, 10, 8, 10, 4, 221, 216, 0, 0, 16, 13, 10, 8, 10, 4, 221, 224, 0, 0, 16, 13, 10, 8, 10, 4, 221, 232, 0, 0, 16, 14, 10, 8, 10, 4, 221, 236, 0, 0, 16, 15, 10, 8, 10, 4, 221, 238, 0, 0, 16, 16, 10, 8, 10, 4, 221, 239, 0, 0, 16, 17, 10, 8, 10, 4, 221, 239, 128, 0, 16, 17, 10, 8, 10, 4, 222, 16, 0, 0, 16, 15, 10, 8, 10, 4, 222, 18, 0, 0, 16, 15, 10, 8, 10, 4, 222, 20, 0, 0, 16, 15, 10, 8, 10, 4, 222, 22, 0, 0, 16, 16, 10, 8, 10, 4, 222, 23, 0, 0, 16, 16, 10, 8, 10, 4, 222, 24, 0, 0, 16, 15, 10, 8, 10, 4, 222, 26, 0, 0, 16, 15, 10, 8, 10, 4, 222, 28, 0, 0, 16, 14, 10, 8, 10, 4, 222, 32, 0, 0, 16, 11, 10, 8, 10, 4, 222, 64, 0, 0, 16, 13, 10, 8, 10, 4, 222, 72, 0, 0, 16, 15, 10, 8, 10, 4, 222, 74, 0, 0, 16, 16, 10, 8, 10, 4, 222, 75, 0, 0, 16, 16, 10, 8, 10, 4, 222, 76, 0, 0, 16, 14, 10, 8, 10, 4, 222, 80, 0, 0, 16, 15, 10, 8, 10, 4, 222, 82, 0, 0, 16, 16, 10, 8, 10, 4, 222, 83, 0, 0, 16, 17, 10, 8, 10, 4, 222, 83, 128, 0, 16, 17, 10, 8, 10, 4, 222, 84, 0, 0, 16, 16, 10, 8, 10, 4, 222, 85, 0, 0, 16, 17, 10, 8, 10, 4, 222, 85, 128, 0, 16, 17, 10, 8, 10, 4, 222, 86, 0, 0, 16, 15, 10, 8, 10, 4, 222, 88, 0, 0, 16, 15, 10, 8, 10, 4, 222, 90, 0, 0, 16, 15, 10, 8, 10, 4, 222, 92, 0, 0, 16, 14, 10, 8, 10, 4, 222, 125, 0, 0, 16, 16, 10, 8, 10, 4, 222, 126, 128, 0, 16, 17, 10, 8, 10, 4, 222, 128, 0, 0, 16, 14, 10, 8, 10, 4, 222, 132, 0, 0, 16, 14, 10, 8, 10, 4, 222, 136, 0, 0, 16, 13, 10, 8, 10, 4, 222, 160, 0, 0, 16, 15, 10, 8, 10, 4, 222, 162, 0, 0, 16, 16, 10, 8, 10, 4, 222, 163, 0, 0, 16, 19, 10, 8, 10, 4, 222, 163, 32, 0, 16, 19, 10, 8, 10, 4, 222, 163, 64, 0, 16, 18, 10, 8, 10, 4, 222, 163, 128, 0, 16, 17, 10, 8, 10, 4, 222, 168, 0, 0, 16, 15, 10, 8, 10, 4, 222, 170, 0, 0, 16, 15, 10, 8, 10, 4, 222, 172, 0, 0, 16, 17, 10, 8, 10, 4, 222, 172, 128, 0, 16, 17, 10, 8, 10, 4, 222, 173, 0, 0, 16, 16, 10, 8, 10, 4, 222, 174, 0, 0, 16, 15, 10, 8, 10, 4, 222, 176, 0, 0, 16, 13, 10, 8, 10, 4, 222, 184, 0, 0, 16, 13, 10, 8, 10, 4, 222, 192, 0, 0, 16, 14, 10, 8, 10, 4, 222, 196, 0, 0, 16, 15, 10, 8, 10, 4, 222, 198, 0, 0, 16, 16, 10, 8, 10, 4, 222, 199, 0, 0, 16, 16, 10, 8, 10, 4, 222, 200, 0, 0, 16, 14, 10, 8, 10, 4, 222, 204, 0, 0, 16, 15, 10, 8, 10, 4, 222, 206, 0, 0, 16, 15, 10, 8, 10, 4, 222, 208, 0, 0, 16, 13, 10, 8, 10, 4, 222, 216, 0, 0, 16, 15, 10, 8, 10, 4, 222, 218, 0, 0, 16, 16, 10, 8, 10, 4, 222, 219, 0, 0, 16, 16, 10, 8, 10, 4, 222, 220, 0, 0, 16, 15, 10, 8, 10, 4, 222, 222, 0, 0, 16, 15, 10, 8, 10, 4, 222, 240, 0, 0, 16, 13, 10, 8, 10, 4, 222, 248, 0, 0, 16, 16, 10, 8, 10, 4, 222, 249, 0, 0, 16, 17, 10, 8, 10, 4, 222, 249, 128, 0, 16, 19, 10, 8, 10, 4, 222, 249, 160, 0, 16, 20, 10, 8, 10, 4, 222, 249, 176, 0, 16, 20, 10, 8, 10, 4, 222, 249, 192, 0, 16, 18, 10, 8, 10, 4, 223, 0, 0, 0, 16, 15, 10, 8, 10, 4, 223, 2, 0, 0, 16, 15, 10, 8, 10, 4, 223, 4, 0, 0, 16, 14, 10, 8, 10, 4, 223, 8, 0, 0, 16, 13, 10, 8, 10, 4, 223, 20, 0, 0, 16, 15, 10, 8, 10, 4, 223, 27, 184, 0, 16, 22, 10, 8, 10, 4, 223, 29, 208, 0, 16, 22, 10, 8, 10, 4, 223, 29, 252, 0, 16, 22, 10, 8, 10, 4, 223, 64, 0, 0, 16, 11, 10, 8, 10, 4, 223, 96, 0, 0, 16, 12, 10, 8, 10, 4, 223, 112, 0, 0, 16, 14, 10, 8, 10, 4, 223, 116, 0, 0, 16, 15, 10, 8, 10, 4, 223, 120, 0, 0, 16, 13, 10, 8, 10, 4, 223, 128, 0, 0, 16, 15, 10, 8, 10, 4, 223, 130, 8, 0, 16, 22, 10, 8, 10, 4, 223, 144, 0, 0, 16, 12, 10, 8, 10, 4, 223, 160, 0, 0, 16, 14, 10, 8, 10, 4, 223, 166, 0, 0, 16, 15, 10, 8, 10, 4, 223, 192, 0, 0, 16, 15, 10, 8, 10, 4, 223, 198, 0, 0, 16, 15, 10, 8, 10, 4, 223, 201, 0, 0, 16, 16, 10, 8, 10, 4, 223, 202, 0, 0, 16, 15, 10, 8, 10, 4, 223, 208, 0, 0, 16, 14, 10, 8, 10, 4, 223, 212, 0, 0, 16, 15, 10, 8, 10, 4, 223, 214, 0, 0, 16, 15, 10, 8, 10, 4, 223, 220, 0, 0, 16, 15, 10, 8, 10, 4, 223, 223, 176, 0, 16, 20, 10, 8, 10, 4, 223, 223, 192, 0, 16, 20, 10, 8, 10, 4, 223, 240, 0, 0, 16, 13, 10, 8, 10, 4, 223, 248, 0, 0, 16, 14, 10, 8, 10, 4, 223, 252, 128, 0, 16, 17, 10, 8, 10, 4, 223, 254, 0, 0, 16, 16, 10, 8, 10, 4, 223, 255, 0, 0, 16, 17, 10, 8, 10, 4, 223, 255, 236, 0, 16, 22, 10, 8, 10, 4, 223, 255, 252, 0, 16, 23} diff --git a/tools/geoip/geoip.go b/tools/geoip/geoip.go deleted file mode 100644 index 4276ecc6..00000000 --- a/tools/geoip/geoip.go +++ /dev/null @@ -1,3 +0,0 @@ -package geoip - -//go:generate go run geoip_gen.go diff --git a/tools/geoip/geoip.pb.go b/tools/geoip/geoip.pb.go deleted file mode 100644 index 945d6c48..00000000 --- a/tools/geoip/geoip.pb.go +++ /dev/null @@ -1,55 +0,0 @@ -package geoip - -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" -import v2ray_core_app_router "v2ray.com/core/app/router" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package - -type CountryIPRange struct { - Ips []*v2ray_core_app_router.CIDR `protobuf:"bytes,1,rep,name=ips" json:"ips,omitempty"` -} - -func (m *CountryIPRange) Reset() { *m = CountryIPRange{} } -func (m *CountryIPRange) String() string { return proto.CompactTextString(m) } -func (*CountryIPRange) ProtoMessage() {} -func (*CountryIPRange) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } - -func (m *CountryIPRange) GetIps() []*v2ray_core_app_router.CIDR { - if m != nil { - return m.Ips - } - return nil -} - -func init() { - proto.RegisterType((*CountryIPRange)(nil), "v2ray.core.tools.geoip.CountryIPRange") -} - -func init() { proto.RegisterFile("v2ray.com/core/tools/geoip/geoip.proto", fileDescriptor0) } - -var fileDescriptor0 = []byte{ - // 184 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x2b, 0x33, 0x2a, 0x4a, - 0xac, 0xd4, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0x2f, 0x4a, 0xd5, 0x2f, 0xc9, 0xcf, 0xcf, 0x29, - 0xd6, 0x4f, 0x4f, 0xcd, 0xcf, 0x2c, 0x80, 0x90, 0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, 0x42, 0x62, - 0x30, 0x75, 0x45, 0xa9, 0x7a, 0x60, 0x35, 0x7a, 0x60, 0x59, 0x29, 0x74, 0xfd, 0x89, 0x05, 0x05, - 0xfa, 0x45, 0xf9, 0xa5, 0x25, 0xa9, 0x45, 0xfa, 0xc9, 0xf9, 0x79, 0x69, 0x99, 0xe9, 0x10, 0xfd, - 0x4a, 0xf6, 0x5c, 0x7c, 0xce, 0xf9, 0xa5, 0x79, 0x25, 0x45, 0x95, 0x9e, 0x01, 0x41, 0x89, 0x79, - 0xe9, 0xa9, 0x42, 0xba, 0x5c, 0xcc, 0x99, 0x05, 0xc5, 0x12, 0x8c, 0x0a, 0xcc, 0x1a, 0xdc, 0x46, - 0xd2, 0x7a, 0x48, 0xe6, 0x27, 0x16, 0x14, 0xe8, 0x41, 0xcc, 0xd0, 0x73, 0xf6, 0x74, 0x09, 0x0a, - 0x02, 0xa9, 0x73, 0xb2, 0xe3, 0x92, 0x4a, 0xce, 0xcf, 0xd5, 0xc3, 0xee, 0x8c, 0x00, 0xc6, 0x28, - 0x56, 0x30, 0x63, 0x15, 0x93, 0x58, 0x98, 0x51, 0x50, 0x62, 0xa5, 0x9e, 0x33, 0x48, 0x45, 0x08, - 0x58, 0x85, 0x3b, 0x48, 0x22, 0x89, 0x0d, 0xec, 0x0e, 0x63, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xe5, 0xf7, 0xf0, 0xf6, 0xf1, 0x00, 0x00, 0x00, -} diff --git a/tools/geoip/geoip.proto b/tools/geoip/geoip.proto deleted file mode 100644 index 10691bc6..00000000 --- a/tools/geoip/geoip.proto +++ /dev/null @@ -1,13 +0,0 @@ -syntax = "proto3"; - -package v2ray.core.tools.geoip; -option csharp_namespace = "V2Ray.Core.Tools.Geoip"; -option go_package = "geoip"; -option java_package = "com.v2ray.core.tools.geoip"; -option java_multiple_files = true; - -import "v2ray.com/core/app/router/config.proto"; - -message CountryIPRange { - repeated v2ray.core.app.router.CIDR ips = 1; -} \ No newline at end of file diff --git a/tools/geoip/geoip_gen.go b/tools/geoip/geoip_gen.go deleted file mode 100644 index 0c56ddda..00000000 --- a/tools/geoip/geoip_gen.go +++ /dev/null @@ -1,92 +0,0 @@ -// +build generate - -package main - -import ( - "bufio" - "fmt" - "log" - "math" - "net" - "net/http" - "os" - "strconv" - "strings" - - "v2ray.com/core/app/router" - "v2ray.com/core/common" - "v2ray.com/core/common/errors" - "v2ray.com/core/tools/geoip" - - "github.com/golang/protobuf/proto" -) - -const ( - apnicFile = "http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest" -) - -func main() { - resp, err := http.Get(apnicFile) - common.Must(err) - if resp.StatusCode != 200 { - panic(errors.New("unexpected status ", resp.StatusCode)) - } - defer resp.Body.Close() - scanner := bufio.NewScanner(resp.Body) - - ips := &geoip.CountryIPRange{ - Ips: make([]*router.CIDR, 0, 8192), - } - for scanner.Scan() { - line := scanner.Text() - line = strings.TrimSpace(line) - parts := strings.Split(line, "|") - if len(parts) < 5 { - continue - } - if strings.ToLower(parts[1]) != "cn" || strings.ToLower(parts[2]) != "ipv4" { - continue - } - ip := parts[3] - count, err := strconv.Atoi(parts[4]) - if err != nil { - continue - } - mask := uint32(math.Floor(math.Log2(float64(count)) + 0.5)) - ipBytes := net.ParseIP(ip) - if len(ipBytes) == 0 { - panic("Invalid IP " + ip) - } - ips.Ips = append(ips.Ips, &router.CIDR{ - Ip: []byte(ipBytes)[12:16], - Prefix: 32 - mask, - }) - } - - ipbytes, err := proto.Marshal(ips) - if err != nil { - log.Fatalf("Failed to marshal country IPs: %v", err) - } - - file, err := os.OpenFile("geoip.generated.go", os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0644) - if err != nil { - log.Fatalf("Failed to generate geoip_data.go: %v", err) - } - defer file.Close() - - fmt.Fprintln(file, "package geoip") - - fmt.Fprintln(file, "var ChinaIPs = "+formatArray(ipbytes)) -} - -func formatArray(a []byte) string { - r := "[]byte{" - for idx, val := range a { - if idx > 0 { - r += "," - } - r += fmt.Sprintf("%d", val) - } - r += "}" - return r -} From 682319a0042bbdab5b0075e40e6b288609e4f945 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 5 Nov 2017 17:19:34 +0100 Subject: [PATCH 087/229] proto def for geosite --- app/router/config.pb.go | 128 +++++++++++++++++++++++++++------------- app/router/config.proto | 9 +++ 2 files changed, 95 insertions(+), 42 deletions(-) diff --git a/app/router/config.pb.go b/app/router/config.pb.go index 9e856163..e31bd617 100644 --- a/app/router/config.pb.go +++ b/app/router/config.pb.go @@ -70,7 +70,7 @@ var Config_DomainStrategy_value = map[string]int32{ func (x Config_DomainStrategy) String() string { return proto.EnumName(Config_DomainStrategy_name, int32(x)) } -func (Config_DomainStrategy) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{5, 0} } +func (Config_DomainStrategy) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{7, 0} } // Domain for routing decision. type Domain struct { @@ -166,6 +166,46 @@ func (m *GeoIPList) GetEntry() []*GeoIP { return nil } +type GeoSite struct { + CountryCode string `protobuf:"bytes,1,opt,name=country_code,json=countryCode" json:"country_code,omitempty"` + Domain []*Domain `protobuf:"bytes,2,rep,name=domain" json:"domain,omitempty"` +} + +func (m *GeoSite) Reset() { *m = GeoSite{} } +func (m *GeoSite) String() string { return proto.CompactTextString(m) } +func (*GeoSite) ProtoMessage() {} +func (*GeoSite) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } + +func (m *GeoSite) GetCountryCode() string { + if m != nil { + return m.CountryCode + } + return "" +} + +func (m *GeoSite) GetDomain() []*Domain { + if m != nil { + return m.Domain + } + return nil +} + +type GeoSiteList struct { + Entry []*GeoSite `protobuf:"bytes,1,rep,name=entry" json:"entry,omitempty"` +} + +func (m *GeoSiteList) Reset() { *m = GeoSiteList{} } +func (m *GeoSiteList) String() string { return proto.CompactTextString(m) } +func (*GeoSiteList) ProtoMessage() {} +func (*GeoSiteList) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } + +func (m *GeoSiteList) GetEntry() []*GeoSite { + if m != nil { + return m.Entry + } + return nil +} + type RoutingRule struct { Tag string `protobuf:"bytes,1,opt,name=tag" json:"tag,omitempty"` Domain []*Domain `protobuf:"bytes,2,rep,name=domain" json:"domain,omitempty"` @@ -180,7 +220,7 @@ type RoutingRule struct { func (m *RoutingRule) Reset() { *m = RoutingRule{} } func (m *RoutingRule) String() string { return proto.CompactTextString(m) } func (*RoutingRule) ProtoMessage() {} -func (*RoutingRule) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } +func (*RoutingRule) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } func (m *RoutingRule) GetTag() string { if m != nil { @@ -246,7 +286,7 @@ type Config struct { func (m *Config) Reset() { *m = Config{} } func (m *Config) String() string { return proto.CompactTextString(m) } func (*Config) ProtoMessage() {} -func (*Config) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } +func (*Config) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } func (m *Config) GetDomainStrategy() Config_DomainStrategy { if m != nil { @@ -267,6 +307,8 @@ func init() { proto.RegisterType((*CIDR)(nil), "v2ray.core.app.router.CIDR") proto.RegisterType((*GeoIP)(nil), "v2ray.core.app.router.GeoIP") proto.RegisterType((*GeoIPList)(nil), "v2ray.core.app.router.GeoIPList") + proto.RegisterType((*GeoSite)(nil), "v2ray.core.app.router.GeoSite") + proto.RegisterType((*GeoSiteList)(nil), "v2ray.core.app.router.GeoSiteList") proto.RegisterType((*RoutingRule)(nil), "v2ray.core.app.router.RoutingRule") proto.RegisterType((*Config)(nil), "v2ray.core.app.router.Config") proto.RegisterEnum("v2ray.core.app.router.Domain_Type", Domain_Type_name, Domain_Type_value) @@ -276,43 +318,45 @@ func init() { func init() { proto.RegisterFile("v2ray.com/core/app/router/config.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 595 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0xc1, 0x6e, 0xd3, 0x4c, - 0x10, 0xc7, 0x3f, 0x3b, 0x89, 0xbf, 0x7a, 0x1c, 0x82, 0xb5, 0xa2, 0xc8, 0x14, 0x2a, 0x82, 0x85, - 0x20, 0x07, 0x64, 0x4b, 0x41, 0xc0, 0x05, 0x54, 0x95, 0xb4, 0x42, 0x91, 0xa0, 0x8a, 0x96, 0x96, - 0x03, 0x1c, 0xac, 0xad, 0xb3, 0x35, 0x2b, 0x92, 0xdd, 0xd5, 0x7a, 0x5d, 0x9a, 0x1b, 0x2f, 0xc0, - 0x8b, 0xf0, 0x34, 0x3c, 0x12, 0xda, 0x5d, 0x17, 0x5a, 0xd4, 0x00, 0xb7, 0x9d, 0xf1, 0x6f, 0x66, - 0xfe, 0x33, 0x9e, 0x81, 0x07, 0xa7, 0x63, 0x45, 0x56, 0x59, 0x29, 0x96, 0x79, 0x29, 0x14, 0xcd, - 0x89, 0x94, 0xb9, 0x12, 0x8d, 0xa6, 0x2a, 0x2f, 0x05, 0x3f, 0x61, 0x55, 0x26, 0x95, 0xd0, 0x02, - 0x6d, 0x9e, 0x73, 0x8a, 0x66, 0x44, 0xca, 0xcc, 0x31, 0x5b, 0xf7, 0x7f, 0x0b, 0x2f, 0xc5, 0x72, - 0x29, 0x78, 0xce, 0xa9, 0xce, 0xa5, 0x50, 0xda, 0x05, 0x6f, 0x3d, 0x5c, 0x4f, 0x71, 0xaa, 0x3f, - 0x0b, 0xf5, 0xc9, 0x81, 0xe9, 0x17, 0x0f, 0x82, 0x3d, 0xb1, 0x24, 0x8c, 0xa3, 0xa7, 0xd0, 0xd5, - 0x2b, 0x49, 0x13, 0x6f, 0xe8, 0x8d, 0x06, 0xe3, 0x34, 0xbb, 0xb2, 0x7e, 0xe6, 0xe0, 0xec, 0x70, - 0x25, 0x29, 0xb6, 0x3c, 0xba, 0x01, 0xbd, 0x53, 0xb2, 0x68, 0x68, 0xe2, 0x0f, 0xbd, 0x51, 0x88, - 0x9d, 0x91, 0x8e, 0xa0, 0x6b, 0x18, 0x14, 0x42, 0x6f, 0xb6, 0x20, 0x8c, 0xc7, 0xff, 0x99, 0x27, - 0xa6, 0x15, 0x3d, 0x8b, 0x3d, 0x04, 0xe7, 0x55, 0x63, 0x3f, 0xcd, 0xa0, 0x3b, 0x99, 0xee, 0x61, - 0x34, 0x00, 0x9f, 0x49, 0x5b, 0xbd, 0x8f, 0x7d, 0x26, 0xd1, 0x4d, 0x08, 0xa4, 0xa2, 0x27, 0xec, - 0xcc, 0x26, 0xbe, 0x86, 0x5b, 0x2b, 0xfd, 0x00, 0xbd, 0x57, 0x54, 0x4c, 0x67, 0xe8, 0x1e, 0xf4, - 0x4b, 0xd1, 0x70, 0xad, 0x56, 0x45, 0x29, 0xe6, 0x4e, 0x78, 0x88, 0xa3, 0xd6, 0x37, 0x11, 0x73, - 0x8a, 0x72, 0xe8, 0x96, 0x6c, 0xae, 0x12, 0x7f, 0xd8, 0x19, 0x45, 0xe3, 0xdb, 0x6b, 0x7a, 0x32, - 0xe5, 0xb1, 0x05, 0xd3, 0x1d, 0x08, 0x6d, 0xf2, 0xd7, 0xac, 0xd6, 0x68, 0x0c, 0x3d, 0x6a, 0x52, - 0x25, 0x9e, 0x0d, 0xbf, 0xb3, 0x26, 0xdc, 0x06, 0x60, 0x87, 0xa6, 0x5f, 0x3b, 0x10, 0x61, 0xd1, - 0x68, 0xc6, 0x2b, 0xdc, 0x2c, 0x28, 0x8a, 0xa1, 0xa3, 0x49, 0xd5, 0x6a, 0x33, 0x4f, 0xf4, 0x04, - 0x82, 0xb9, 0xed, 0xbd, 0x55, 0xb5, 0xfd, 0xc7, 0x49, 0xe3, 0x16, 0xfe, 0xd9, 0x4a, 0xe7, 0x1f, - 0x5b, 0x41, 0x3b, 0x00, 0x66, 0x23, 0x0a, 0x45, 0x78, 0x45, 0x93, 0xee, 0xd0, 0x1b, 0x45, 0xe3, - 0xe1, 0xc5, 0x30, 0xb7, 0x14, 0x19, 0xa7, 0x3a, 0x9b, 0x09, 0xa5, 0xb1, 0xe1, 0x70, 0x28, 0xcf, - 0x9f, 0x68, 0x1f, 0xfa, 0xed, 0xb2, 0x14, 0x0b, 0x56, 0xeb, 0xa4, 0x67, 0x53, 0xa4, 0x6b, 0x52, - 0x1c, 0x38, 0xd4, 0x0c, 0x0e, 0x47, 0xfc, 0x97, 0x81, 0x9e, 0x43, 0x54, 0x8b, 0x46, 0x95, 0xb4, - 0xb0, 0xfa, 0x83, 0xbf, 0xeb, 0x07, 0xc7, 0x4f, 0x4c, 0x17, 0xdb, 0x00, 0x4d, 0x4d, 0x55, 0x41, - 0x97, 0x84, 0x2d, 0x92, 0xff, 0x87, 0x9d, 0x51, 0x88, 0x43, 0xe3, 0xd9, 0x37, 0x0e, 0x74, 0x17, - 0x22, 0xc6, 0x8f, 0x45, 0xc3, 0xe7, 0x85, 0x19, 0xf3, 0x86, 0xfd, 0x0e, 0xad, 0xeb, 0x90, 0x54, - 0xe9, 0x77, 0x0f, 0x82, 0x89, 0xbd, 0x2b, 0x74, 0x04, 0xd7, 0xdd, 0x2c, 0x8b, 0x5a, 0x2b, 0xa2, - 0x69, 0xb5, 0x6a, 0x77, 0xfd, 0xd1, 0x3a, 0x31, 0xee, 0x1e, 0xdd, 0x8f, 0x78, 0xdb, 0xc6, 0xe0, - 0xc1, 0xfc, 0x92, 0x6d, 0xee, 0x46, 0x35, 0x0b, 0xda, 0xfe, 0xcd, 0x75, 0x77, 0x73, 0x61, 0x27, - 0xb0, 0xe5, 0xd3, 0x67, 0x30, 0xb8, 0x9c, 0x19, 0x6d, 0x40, 0x77, 0xb7, 0x9e, 0xd6, 0xee, 0x54, - 0x8e, 0x6a, 0x3a, 0x95, 0xb1, 0x87, 0x62, 0xe8, 0x4f, 0xe5, 0xf4, 0xe4, 0x40, 0xf0, 0x37, 0x44, - 0x97, 0x1f, 0x63, 0xff, 0xe5, 0x0b, 0xb8, 0x55, 0x8a, 0xe5, 0xd5, 0x75, 0x66, 0xde, 0xfb, 0xc0, - 0xbd, 0xbe, 0xf9, 0x9b, 0xef, 0xc6, 0x98, 0xac, 0xb2, 0x89, 0x21, 0x76, 0xa5, 0xb4, 0x12, 0xa8, - 0x3a, 0x0e, 0xec, 0xe5, 0x3f, 0xfe, 0x11, 0x00, 0x00, 0xff, 0xff, 0x5a, 0x12, 0x0e, 0x89, 0x89, - 0x04, 0x00, 0x00, + // 626 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x94, 0xdf, 0x6e, 0xd3, 0x30, + 0x14, 0xc6, 0x49, 0xda, 0x66, 0xcb, 0x49, 0x29, 0x91, 0xc5, 0x50, 0x18, 0x0c, 0x4a, 0x84, 0xa0, + 0x17, 0x28, 0x91, 0xca, 0xbf, 0x1b, 0xd0, 0x34, 0xba, 0x69, 0xaa, 0x04, 0x53, 0xe5, 0x6d, 0x5c, + 0xc0, 0x45, 0x94, 0xa5, 0x5e, 0x88, 0x68, 0x6d, 0xcb, 0x71, 0xc6, 0x7a, 0xc7, 0x0b, 0xf0, 0x22, + 0x3c, 0x0d, 0x8f, 0x84, 0x6c, 0xa7, 0xb0, 0xa2, 0x05, 0x26, 0xee, 0x6c, 0xe7, 0xf7, 0x9d, 0xf3, + 0xe5, 0xf8, 0x1c, 0xc3, 0xa3, 0xb3, 0xa1, 0x48, 0x17, 0x51, 0xc6, 0xe6, 0x71, 0xc6, 0x04, 0x89, + 0x53, 0xce, 0x63, 0xc1, 0x2a, 0x49, 0x44, 0x9c, 0x31, 0x7a, 0x5a, 0xe4, 0x11, 0x17, 0x4c, 0x32, + 0xb4, 0xb1, 0xe4, 0x04, 0x89, 0x52, 0xce, 0x23, 0xc3, 0x6c, 0x3e, 0xfc, 0x43, 0x9e, 0xb1, 0xf9, + 0x9c, 0xd1, 0x98, 0x12, 0x19, 0x73, 0x26, 0xa4, 0x11, 0x6f, 0x3e, 0x6e, 0xa6, 0x28, 0x91, 0x5f, + 0x98, 0xf8, 0x6c, 0xc0, 0xf0, 0xab, 0x05, 0xce, 0x2e, 0x9b, 0xa7, 0x05, 0x45, 0x2f, 0xa0, 0x2d, + 0x17, 0x9c, 0x04, 0x56, 0xdf, 0x1a, 0xf4, 0x86, 0x61, 0x74, 0x69, 0xfe, 0xc8, 0xc0, 0xd1, 0xd1, + 0x82, 0x13, 0xac, 0x79, 0x74, 0x13, 0x3a, 0x67, 0xe9, 0xac, 0x22, 0x81, 0xdd, 0xb7, 0x06, 0x2e, + 0x36, 0x9b, 0x70, 0x00, 0x6d, 0xc5, 0x20, 0x17, 0x3a, 0x93, 0x59, 0x5a, 0x50, 0xff, 0x9a, 0x5a, + 0x62, 0x92, 0x93, 0x73, 0xdf, 0x42, 0xb0, 0xcc, 0xea, 0xdb, 0x61, 0x04, 0xed, 0xd1, 0x78, 0x17, + 0xa3, 0x1e, 0xd8, 0x05, 0xd7, 0xd9, 0xbb, 0xd8, 0x2e, 0x38, 0xba, 0x05, 0x0e, 0x17, 0xe4, 0xb4, + 0x38, 0xd7, 0x81, 0xaf, 0xe3, 0x7a, 0x17, 0x7e, 0x84, 0xce, 0x3e, 0x61, 0xe3, 0x09, 0x7a, 0x00, + 0xdd, 0x8c, 0x55, 0x54, 0x8a, 0x45, 0x92, 0xb1, 0xa9, 0x31, 0xee, 0x62, 0xaf, 0x3e, 0x1b, 0xb1, + 0x29, 0x41, 0x31, 0xb4, 0xb3, 0x62, 0x2a, 0x02, 0xbb, 0xdf, 0x1a, 0x78, 0xc3, 0x3b, 0x0d, 0xff, + 0xa4, 0xd2, 0x63, 0x0d, 0x86, 0xdb, 0xe0, 0xea, 0xe0, 0x6f, 0x8b, 0x52, 0xa2, 0x21, 0x74, 0x88, + 0x0a, 0x15, 0x58, 0x5a, 0x7e, 0xb7, 0x41, 0xae, 0x05, 0xd8, 0xa0, 0x61, 0x06, 0x6b, 0xfb, 0x84, + 0x1d, 0x16, 0x92, 0x5c, 0xc5, 0xdf, 0x73, 0x70, 0xa6, 0xba, 0x0e, 0xb5, 0xc3, 0xad, 0xbf, 0x56, + 0x1d, 0xd7, 0x70, 0x38, 0x02, 0xaf, 0x4e, 0xa2, 0x7d, 0x3e, 0x5b, 0xf5, 0x79, 0xaf, 0xd9, 0xa7, + 0x92, 0x2c, 0x9d, 0x7e, 0x6b, 0x81, 0x87, 0x59, 0x25, 0x0b, 0x9a, 0xe3, 0x6a, 0x46, 0x90, 0x0f, + 0x2d, 0x99, 0xe6, 0xb5, 0x4b, 0xb5, 0xfc, 0x4f, 0x77, 0xbf, 0x8a, 0xde, 0xba, 0x62, 0xd1, 0xd1, + 0x36, 0x80, 0xea, 0xdd, 0x44, 0xa4, 0x34, 0x27, 0x41, 0xbb, 0x6f, 0x0d, 0xbc, 0x61, 0xff, 0xa2, + 0xcc, 0xb4, 0x6f, 0x44, 0x89, 0x8c, 0x26, 0x4c, 0x48, 0xac, 0x38, 0xec, 0xf2, 0xe5, 0x12, 0xed, + 0x41, 0xb7, 0x6e, 0xeb, 0x64, 0x56, 0x94, 0x32, 0xe8, 0xe8, 0x10, 0x61, 0x43, 0x88, 0x03, 0x83, + 0xaa, 0xd2, 0x61, 0x8f, 0xfe, 0xde, 0xa0, 0x57, 0xe0, 0x95, 0xac, 0x12, 0x19, 0x49, 0xb4, 0x7f, + 0xe7, 0xdf, 0xfe, 0xc1, 0xf0, 0x23, 0xf5, 0x17, 0x5b, 0x00, 0x55, 0x49, 0x44, 0x42, 0xe6, 0x69, + 0x31, 0x0b, 0xd6, 0xfa, 0xad, 0x81, 0x8b, 0x5d, 0x75, 0xb2, 0xa7, 0x0e, 0xd0, 0x7d, 0xf0, 0x0a, + 0x7a, 0xc2, 0x2a, 0x3a, 0x4d, 0x54, 0x99, 0xd7, 0xf5, 0x77, 0xa8, 0x8f, 0x8e, 0xd2, 0x3c, 0xfc, + 0x61, 0x81, 0x33, 0xd2, 0x2f, 0x00, 0x3a, 0x86, 0x1b, 0xa6, 0x96, 0x49, 0x29, 0x45, 0x2a, 0x49, + 0xbe, 0xa8, 0xa7, 0xf2, 0x49, 0x93, 0x19, 0xf3, 0x72, 0x98, 0x8b, 0x38, 0xac, 0x35, 0xb8, 0x37, + 0x5d, 0xd9, 0xab, 0x09, 0x17, 0xd5, 0x8c, 0xd4, 0xb7, 0xd9, 0x34, 0xe1, 0x17, 0x7a, 0x02, 0x6b, + 0x3e, 0x7c, 0x09, 0xbd, 0xd5, 0xc8, 0x68, 0x1d, 0xda, 0x3b, 0xe5, 0xb8, 0x34, 0x43, 0x7d, 0x5c, + 0x92, 0x31, 0xf7, 0x2d, 0xe4, 0x43, 0x77, 0xcc, 0xc7, 0xa7, 0x07, 0x8c, 0xbe, 0x4b, 0x65, 0xf6, + 0xc9, 0xb7, 0xdf, 0xbc, 0x86, 0xdb, 0x19, 0x9b, 0x5f, 0x9e, 0x67, 0x62, 0x7d, 0x70, 0xcc, 0xea, + 0xbb, 0xbd, 0xf1, 0x7e, 0x88, 0xd3, 0x45, 0x34, 0x52, 0xc4, 0x0e, 0xe7, 0xda, 0x02, 0x11, 0x27, + 0x8e, 0x7e, 0xa3, 0x9e, 0xfe, 0x0c, 0x00, 0x00, 0xff, 0xff, 0x6d, 0xa3, 0xd9, 0xd0, 0x33, 0x05, + 0x00, 0x00, } diff --git a/app/router/config.proto b/app/router/config.proto index 51595fae..b693652c 100644 --- a/app/router/config.proto +++ b/app/router/config.proto @@ -46,6 +46,15 @@ message GeoIPList { repeated GeoIP entry = 1; } +message GeoSite { + string country_code = 1; + repeated Domain domain = 2; +} + +message GeoSiteList{ + repeated GeoSite entry = 1; +} + message RoutingRule { string tag = 1; repeated Domain domain = 2; From e60de73c704d46d91633035e6b06184f7186a4e0 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 5 Nov 2017 17:19:39 +0100 Subject: [PATCH 088/229] geosite data --- tools/release/config/geosite.dat | 113 +++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100755 tools/release/config/geosite.dat diff --git a/tools/release/config/geosite.dat b/tools/release/config/geosite.dat new file mode 100755 index 00000000..384de846 --- /dev/null +++ b/tools/release/config/geosite.dat @@ -0,0 +1,113 @@ + +; +CNcn +xn--fiqs8s  10010.com 100offer.com 115.com 123juzi.com 123juzi.net 123u.com 126.com 126.net 127.net 163.com  17173.com  17cdn.com 188.com 1905.com 21cn.com 2288.org 2345.com 263.net 2cto.com 3322.org +35.com +360doc.com +360buy.com 360buyimg.com 360safe.com 36kr.com +39.net 3dmgame.com 3conline.com 4399.com 500d.me +50bang.org 51.la 51credit.com  51cto.com51jingying.com  51job.com 51jobcdn.com 51wendang.com +55.com  51yes.com  55bbs.com +58.com +6rooms.com 71.am 7k7k.com +900.la 9718.com 9xu.com abchina.com acfun.tv acgvideo.com agrantsem.com  aicdn.com aixifan.com alibaba.com +alicdn.comaliimg.com.com +alipay.comalipayobjects.com +aliyun.com aliyuncdn.com aliyuncs.com +allyes.com amap.com +anjuke.com +anquan.org +appinn.com babytree.combabytreeimg.com  baidu.combaiducontent.com baidupcs.combaidustatic.combaifendian.com baifubao.com  baihe.com  baike.com baixing.com baixing.net bankcomm.combankofchina.com bcy.net  bdimg.com bdstatic.com bilibili.com cn.bing.com bitauto.combitautoimg.com bobo.com bootcss.com btcfans.com caiyunapp.com ccb.com cctv.com cctvpic.com  cdn20.com cebbank.com +ch.com chashebao.com +che168.com  china.comchinacache.comchinacache.net chinahr.comchinamobile.com chinapay.comchinatranslation.net +chinaz.com chiphell.com +chouti.com chuangxin.com chuansong.me clouddn.com cloudxns.com cmbchina.com +cnbeta.com cnbetacdn.com cnblogs.com +cnepub.com cnzz.com +coding.net coolapk.com  cqvip.com  csbew.com csdn.net +ctfile.com  ctrip.com +cubead.com  dajie.com dajieimg.com dangdang.com daocloud.io daovoice.io  dbank.com dedecms.com  dgtle.com diandian.com dianping.com +diopic.net  docin.com dockerone.com +dockone.io +donews.com +douban.com doubanio.com +dpfile.com +duomai.com duoshuo.com +duowan.com dxpmedia.com eastday.com +ecitic.com emarbox.comeoeandroid.com etao.com excelhome.net  fanli.com feng.com fengniao.com +fhldns.com foxmail.com geekpark.net geetest.com geilicdn.com  getui.comgoogle-analytics.com growingio.com  gtags.net +gwdang.com +hao123.com hao123img.com +haosou.com  hdslb.com  henha.com henkuai.com  hexun.com hichina.com huanqiu.com hunantv.comhuochepiao.com hupu.com hupucdn.com  huxiu.com iask.com  iciba.com idqqimg.com  ifanr.comifanrusercontent.com +ifanrx.com  ifeng.com ifengimg.com ijinshan.com +ikafan.com +imedao.com imgo.tv  imooc.com  infoq.cominfoqstatic.com  ip138.com ipinyou.com ipip.net +ip-cdn.com  iqiyi.com  it165.net  it168.com  it610.com  iteye.com +ithome.com +itjuzi.com +jandan.net +jd.com jb51.com jia.com jianshu.com +jianshu.io jiasuhui.com jiathis.com jiayuan.comjikexueyuan.com jisuanke.com jmstatic.com jsdelivr.net jstv.com  jumei.com  jyimg.com kaixin001.com +kanimg.com kankanews.com  kejet.net kf5.com +kimiss.com +kouclo.com +koudai.com koudai8.com ku6.com +ku6cdn.com +ku6img.com  kuqin.com lady8844.com  lagou.com +le.com leanote.com leiphone.com leju.com leturich.org letv.com letvcdn.com letvimg.com  liantu.meliaoxuefeng.com liba.com libaclub.com +liepin.com +lietou.com lightonus.com linkvans.com linuxidc.com liuxiaoer.com +lofter.com +lu.com  lufax.com lufaxcdn.com +lvmama.com  lxdns.com  lxway.com +ly.com +mayihr.com mechina.org +mediav.com +meiqia.com meika360.com meilishuo.com meishij.net meituan.com  meizu.com mgtv.com +mi.com miaopai.com miaozhen.com miui.com +mmbang.com mmbang.info +mmstat.com mogucdn.com mogujie.com mop.com +mscbsc.com mukewang.com mydrivers.com myshow360.net mzstatic.com netease.comnewbandeng.com ngacn.cc ntalker.com nvsheng.com  oeeee.com +ol-img.com +oneapm.comonlinedown.netonlinesjtu.com oschina.net +paipai.com +pcbeta.com +pchome.net +pingan.compingplusplus.com +pps.tv psbc.com +pubyun.com qbox.me +qcloud.com  qhimg.comqiaobutang.com +qidian.com qingcloud.comqingsongchou.com  qiniu.com qiniucdn.com qiniudn.com qiniudns.com qiyi.com qiyipic.com +qtmojo.com +qq.com +qqmail.com  qunar.com qunarzz.com  qzone.com +renren.com +runoob.com ruanmei.comruby-china.org +sandai.net sanguosha.com +sanwen.netsegmentfault.comsf-express.com sharejs.com shmetro.com +shutcm.com +simei8.com sina.com sinaapp.com sinaedge.com sinaimg.com +sinajs.com szzfgjj.com  smzdm.com sohu.com  sogou.com sogoucdn.com soso.com  sspai.com starbaby.cc starbaby.comstaticfile.org stockstar.com +suning.com szfw.org t1y5.com tanx.com +tao123.com +taobao.com taobaocdn.com tbcache.com tencent.com +tenpay.com tenxcloud.com tiebaimg.com tietuku.com +tiexue.net  tmall.com  tmcdn.net topthink.com  tudou.com tudouui.com tuicool.com  tuniu.com tutuapp.com u17.com  useso.com unionpay.comunionpaysecure.com  upyun.com upaiyun.com v2ex.com  v5875.com vamaker.com  vancl.com  vcimg.com vip.comwallstreetcn.com wandoujia.com +wdjimg.com  weand.com webterren.com  weibo.com weicaifu.com weidian.com weiphone.com weiphone.net weixing.com +weiyun.com wonnder.com worktile.com +wooyun.org wrating.com +wscdns.com  wumii.comxiachufang.com  xiami.com xiaokaxiu.com +xiaomi.com xitu.com xinhuanet.com xinshipu.com xiu8.com  xnpic.com +xueqiu.com +xunlei.com xywy.com +yaolan.com  yccdn.com +yeepay.com  yesky.com  yigao.com yihaodian.comyihaodianimg.comyingjiesheng.com yinxiang.com yixi.tv  yjbys.com yhd.com +youboy.com  youku.com yunba.io yundaex.com yunshipei.com  yupoo.com  yuzua.com +yy.com +yytcdn.com +zampda.net zastatic.com +zbjimg.com +zdfans.com +zdmimg.com +zhenai.com  zhanqi.tv zhaopin.com  zhihu.com  zhimg.com zhiziyun.com  zjstv.com zhubajie.com +zrblog.net  zuche.com zuchecdn.com \ No newline at end of file From 95b8be93c3f3cfa1293d7cbcd33e71ba8c580494 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 5 Nov 2017 20:12:40 +0100 Subject: [PATCH 089/229] exit on mandatory files only --- release/install-release.sh | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/release/install-release.sh b/release/install-release.sh index 5ead29c5..e2564ead 100755 --- a/release/install-release.sh +++ b/release/install-release.sh @@ -193,10 +193,13 @@ startV2ray(){ copyFile() { NAME=$1 + MANDATE=$2 ERROR=`cp "/tmp/v2ray/v2ray-${NEW_VER}-linux-${VDIS}/${NAME}" "/usr/bin/v2ray/${NAME}"` if [[ $? -ne 0 ]]; then - colorEcho ${YELLOW} "${ERROR}" - exit + colorEcho ${YELLOW} "${ERROR}" + if [ "$MANDATE" = true ]; then + exit + fi fi } @@ -207,11 +210,12 @@ makeExecutable() { installV2Ray(){ # Install V2Ray binary to /usr/bin/v2ray mkdir -p /usr/bin/v2ray - copyFile v2ray + copyFile v2ray true makeExecutable v2ray - copyFile v2ctl + copyFile v2ctl false makeExecutable v2ctl - copyFile geoip.dat + copyFile geoip.dat false + copyFile geosite.dat false # Install V2Ray server config to /etc/v2ray mkdir -p /etc/v2ray From 973378d610b839bcf4c08b687c962d296e09a54a Mon Sep 17 00:00:00 2001 From: Valture Date: Sun, 5 Nov 2017 19:24:26 +0000 Subject: [PATCH 090/229] Prevent UA from being set to golang's default ones Go automatically sets HTTP header `User-Agent' to `Go-http-client/1.1' if it hasn't been set before, which in some cases breaks the transparency of proxy. Such behavior can be prevented by setting it to an empty string. --- proxy/http/server.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/proxy/http/server.go b/proxy/http/server.go index 6ed20e60..01d4d74d 100644 --- a/proxy/http/server.go +++ b/proxy/http/server.go @@ -212,6 +212,11 @@ func StripHopByHopHeaders(header http.Header) { for _, h := range strings.Split(connections, ",") { header.Del(strings.TrimSpace(h)) } + + // Prevent UA from being set to golang's default ones + if len(header.Get("User-Agent")) == 0 { + header.Set("User-Agent", "") + } } var errWaitAnother = newError("keep alive") From 40b97e7cd3eadcbe6d1663bc8bebb893c50fb6ba Mon Sep 17 00:00:00 2001 From: Valture Date: Sun, 5 Nov 2017 20:06:40 +0000 Subject: [PATCH 091/229] add test for UA header --- proxy/http/server_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/proxy/http/server_test.go b/proxy/http/server_test.go index f2d1dafc..c4b156f1 100644 --- a/proxy/http/server_test.go +++ b/proxy/http/server_test.go @@ -22,7 +22,6 @@ Foo: foo Bar: bar Proxy-Connection: keep-alive Proxy-Authenticate: abc -User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X; de-de) AppleWebKit/523.10.3 (KHTML, like Gecko) Version/3.0.4 Safari/523.10 Accept-Encoding: gzip Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7 Cache-Control: no-cache @@ -37,6 +36,7 @@ Accept-Language: de,en;q=0.7,en-us;q=0.3 assert(req.Header.Get("Connection"), Equals, "keep-alive,Foo, Bar") assert(req.Header.Get("Proxy-Connection"), Equals, "keep-alive") assert(req.Header.Get("Proxy-Authenticate"), Equals, "abc") + assert(req.Header.Get("User-Agent"), IsEmpty) StripHopByHopHeaders(req.Header) assert(req.Header.Get("Connection"), IsEmpty) @@ -44,4 +44,5 @@ Accept-Language: de,en;q=0.7,en-us;q=0.3 assert(req.Header.Get("Bar"), IsEmpty) assert(req.Header.Get("Proxy-Connection"), IsEmpty) assert(req.Header.Get("Proxy-Authenticate"), IsEmpty) + assert(req.Header.Get("User-Agent"), IsEmpty) } From 4444cc985d1dfd7251c189d981fe2c2aa8308bbb Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 5 Nov 2017 22:13:15 +0100 Subject: [PATCH 092/229] http proxy in transparent mode --- proxy/http/config.pb.go | 46 +++++++++++++++++++++++++---------------- proxy/http/config.proto | 1 + proxy/http/server.go | 7 +++++-- 3 files changed, 34 insertions(+), 20 deletions(-) diff --git a/proxy/http/config.pb.go b/proxy/http/config.pb.go index 37df52f0..0b4170a5 100644 --- a/proxy/http/config.pb.go +++ b/proxy/http/config.pb.go @@ -17,8 +17,9 @@ const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package // Config for HTTP proxy server. type ServerConfig struct { - Timeout uint32 `protobuf:"varint,1,opt,name=timeout" json:"timeout,omitempty"` - Accounts map[string]string `protobuf:"bytes,2,rep,name=accounts" json:"accounts,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + Timeout uint32 `protobuf:"varint,1,opt,name=timeout" json:"timeout,omitempty"` + Accounts map[string]string `protobuf:"bytes,2,rep,name=accounts" json:"accounts,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + AllowTransparent bool `protobuf:"varint,3,opt,name=allow_transparent,json=allowTransparent" json:"allow_transparent,omitempty"` } func (m *ServerConfig) Reset() { *m = ServerConfig{} } @@ -40,6 +41,13 @@ func (m *ServerConfig) GetAccounts() map[string]string { return nil } +func (m *ServerConfig) GetAllowTransparent() bool { + if m != nil { + return m.AllowTransparent + } + return false +} + // ClientConfig for HTTP proxy client. type ClientConfig struct { } @@ -57,20 +65,22 @@ func init() { func init() { proto.RegisterFile("v2ray.com/core/proxy/http/config.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 238 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x2b, 0x33, 0x2a, 0x4a, - 0xac, 0xd4, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0x2f, 0x4a, 0xd5, 0x2f, 0x28, 0xca, 0xaf, 0xa8, - 0xd4, 0xcf, 0x28, 0x29, 0x29, 0xd0, 0x4f, 0xce, 0xcf, 0x4b, 0xcb, 0x4c, 0xd7, 0x2b, 0x28, 0xca, - 0x2f, 0xc9, 0x17, 0x12, 0x85, 0xa9, 0x2b, 0x4a, 0xd5, 0x03, 0xab, 0xd1, 0x03, 0xa9, 0x51, 0xda, - 0xc2, 0xc8, 0xc5, 0x13, 0x9c, 0x5a, 0x54, 0x96, 0x5a, 0xe4, 0x0c, 0x56, 0x2d, 0x24, 0xc1, 0xc5, - 0x5e, 0x92, 0x99, 0x9b, 0x9a, 0x5f, 0x5a, 0x22, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0x1b, 0x04, 0xe3, - 0x0a, 0xf9, 0x72, 0x71, 0x24, 0x26, 0x27, 0xe7, 0x97, 0xe6, 0x95, 0x14, 0x4b, 0x30, 0x29, 0x30, - 0x6b, 0x70, 0x1b, 0x19, 0xea, 0x61, 0x35, 0x54, 0x0f, 0xd9, 0x40, 0x3d, 0x47, 0xa8, 0x1e, 0xd7, - 0xbc, 0x92, 0xa2, 0xca, 0x20, 0xb8, 0x11, 0x52, 0xd6, 0x5c, 0xbc, 0x28, 0x52, 0x42, 0x02, 0x5c, - 0xcc, 0xd9, 0xa9, 0x95, 0x60, 0x5b, 0x39, 0x83, 0x40, 0x4c, 0x21, 0x11, 0x2e, 0xd6, 0xb2, 0xc4, - 0x9c, 0xd2, 0x54, 0x09, 0x26, 0xb0, 0x18, 0x84, 0x63, 0xc5, 0x64, 0xc1, 0xa8, 0xc4, 0xc7, 0xc5, - 0xe3, 0x9c, 0x93, 0x99, 0x9a, 0x57, 0x02, 0xb1, 0xc4, 0xc9, 0x9a, 0x4b, 0x32, 0x39, 0x3f, 0x17, - 0xbb, 0x73, 0x02, 0x18, 0xa3, 0x58, 0x40, 0xf4, 0x2a, 0x26, 0xd1, 0x30, 0xa3, 0xa0, 0xc4, 0x4a, - 0x3d, 0x67, 0x90, 0x7c, 0x00, 0x58, 0xde, 0xa3, 0xa4, 0xa4, 0x20, 0x89, 0x0d, 0x1c, 0x42, 0xc6, - 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x07, 0x0a, 0xdd, 0xc0, 0x4b, 0x01, 0x00, 0x00, + // 271 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x90, 0x5d, 0x4b, 0xc3, 0x30, + 0x14, 0x86, 0x49, 0xe7, 0xc7, 0x8c, 0x9b, 0xcc, 0xe0, 0xa0, 0x7a, 0x55, 0x76, 0x21, 0x05, 0x21, + 0xc5, 0x7a, 0x23, 0xee, 0x4a, 0x8b, 0xe0, 0x8d, 0x30, 0xaa, 0x78, 0xe1, 0x8d, 0xc4, 0x10, 0xb5, + 0xd8, 0xe6, 0x94, 0xb3, 0xd3, 0x6a, 0xfe, 0x92, 0xff, 0xca, 0x7f, 0x22, 0xcd, 0x9c, 0x1f, 0xb0, + 0xab, 0xe4, 0x9c, 0xf7, 0xc9, 0xc3, 0x4b, 0xf8, 0x61, 0x9b, 0xa2, 0x72, 0x52, 0x43, 0x95, 0x68, + 0x40, 0x93, 0xd4, 0x08, 0xef, 0x2e, 0x79, 0x21, 0xaa, 0x13, 0x0d, 0xf6, 0xa9, 0x78, 0x96, 0x35, + 0x02, 0x81, 0x18, 0x2f, 0x39, 0x34, 0xd2, 0x33, 0xb2, 0x63, 0x26, 0x9f, 0x8c, 0x0f, 0x6e, 0x0c, + 0xb6, 0x06, 0x33, 0x4f, 0x8b, 0x90, 0x6f, 0x52, 0x51, 0x19, 0x68, 0x28, 0x64, 0x11, 0x8b, 0x87, + 0xf9, 0x72, 0x14, 0xd7, 0xbc, 0xaf, 0xb4, 0x86, 0xc6, 0xd2, 0x3c, 0x0c, 0xa2, 0x5e, 0xbc, 0x9d, + 0x1e, 0xcb, 0x95, 0x52, 0xf9, 0x57, 0x28, 0xcf, 0xbf, 0xdf, 0x5c, 0x5a, 0x42, 0x97, 0xff, 0x28, + 0xc4, 0x11, 0xdf, 0x55, 0x65, 0x09, 0x6f, 0x0f, 0x84, 0xca, 0xce, 0x6b, 0x85, 0xc6, 0x52, 0xd8, + 0x8b, 0x58, 0xdc, 0xcf, 0x47, 0x3e, 0xb8, 0xfd, 0xdd, 0x1f, 0x4c, 0xf9, 0xf0, 0x9f, 0x47, 0x8c, + 0x78, 0xef, 0xd5, 0x38, 0x5f, 0x71, 0x2b, 0xef, 0xae, 0x62, 0x8f, 0xaf, 0xb7, 0xaa, 0x6c, 0x4c, + 0x18, 0xf8, 0xdd, 0x62, 0x38, 0x0b, 0x4e, 0xd9, 0x64, 0x87, 0x0f, 0xb2, 0xb2, 0x30, 0x96, 0x16, + 0x8d, 0x2e, 0xa6, 0x7c, 0x5f, 0x43, 0xb5, 0xba, 0xfb, 0x8c, 0xdd, 0xaf, 0x75, 0xe7, 0x47, 0x30, + 0xbe, 0x4b, 0x73, 0xe5, 0x64, 0xd6, 0xe5, 0x33, 0x9f, 0x5f, 0x11, 0xd5, 0x8f, 0x1b, 0xfe, 0x3b, + 0x4f, 0xbe, 0x02, 0x00, 0x00, 0xff, 0xff, 0xf5, 0x08, 0xbc, 0x0a, 0x78, 0x01, 0x00, 0x00, } diff --git a/proxy/http/config.proto b/proxy/http/config.proto index 9d96f163..a1d014e8 100644 --- a/proxy/http/config.proto +++ b/proxy/http/config.proto @@ -10,6 +10,7 @@ option java_multiple_files = true; message ServerConfig { uint32 timeout = 1; map accounts = 2; + bool allow_transparent = 3; } // ClientConfig for HTTP proxy client. diff --git a/proxy/http/server.go b/proxy/http/server.go index 6ed20e60..13fb650a 100644 --- a/proxy/http/server.go +++ b/proxy/http/server.go @@ -217,7 +217,8 @@ func StripHopByHopHeaders(header http.Header) { var errWaitAnother = newError("keep alive") func (s *Server) handlePlainHTTP(ctx context.Context, request *http.Request, reader io.Reader, writer io.Writer, dest net.Destination, dispatcher dispatcher.Interface) error { - if len(request.URL.Host) <= 0 { + if !s.config.AllowTransparent && len(request.URL.Host) <= 0 { + // RFC 2068 (HTTP/1.1) requires URL to be absolute URL in HTTP proxy. response := &http.Response{ Status: "Bad Request", StatusCode: 400, @@ -234,7 +235,9 @@ func (s *Server) handlePlainHTTP(ctx context.Context, request *http.Request, rea return response.Write(writer) } - request.Host = request.URL.Host + if len(request.URL.Host) > 0 { + request.Host = request.URL.Host + } StripHopByHopHeaders(request.Header) ray, err := dispatcher.Dispatch(ctx, dest) From 064d7249f5cf8c09c0cb9b7e3978cc56295cc8ab Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 5 Nov 2017 23:39:47 +0100 Subject: [PATCH 093/229] banchmark IPNetTable --- common/net/ipnet_test.go | 73 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/common/net/ipnet_test.go b/common/net/ipnet_test.go index 5c22c833..572c4ed1 100644 --- a/common/net/ipnet_test.go +++ b/common/net/ipnet_test.go @@ -2,8 +2,16 @@ package net_test import ( "net" + "os" + "path/filepath" "testing" + proto "github.com/golang/protobuf/proto" + "v2ray.com/core/app/router" + "v2ray.com/core/common/platform" + + "v2ray.com/ext/sysio" + "v2ray.com/core/common" . "v2ray.com/core/common/net" . "v2ray.com/ext/assert" @@ -43,3 +51,68 @@ func TestIPNet(t *testing.T) { assert(ipNet.Contains(ParseIP("2001:cdba::3257:9652")), IsFalse) assert(ipNet.Contains(ParseIP("91.108.255.254")), IsTrue) } + +func loadGeoIP(country string) ([]*router.CIDR, error) { + geoipBytes, err := sysio.ReadAsset("geoip.dat") + if err != nil { + return nil, err + } + var geoipList router.GeoIPList + if err := proto.Unmarshal(geoipBytes, &geoipList); err != nil { + return nil, err + } + + for _, geoip := range geoipList.Entry { + if geoip.CountryCode == country { + return geoip.Cidr, nil + } + } + + panic("country not found: " + country) +} + +func BenchmarkIPNetQuery(b *testing.B) { + common.Must(sysio.CopyFile(platform.GetAssetLocation("geoip.dat"), filepath.Join(os.Getenv("GOPATH"), "src", "v2ray.com", "core", "tools", "release", "config", "geoip.dat"))) + + ips, err := loadGeoIP("CN") + common.Must(err) + + ipNet := NewIPNetTable() + for _, ip := range ips { + ipNet.AddIP(ip.Ip, byte(ip.Prefix)) + } + + b.ResetTimer() + + for i := 0; i < b.N; i++ { + ipNet.Contains([]byte{8, 8, 8, 8}) + } +} + +func BenchmarkCIDRQuery(b *testing.B) { + common.Must(sysio.CopyFile(platform.GetAssetLocation("geoip.dat"), filepath.Join(os.Getenv("GOPATH"), "src", "v2ray.com", "core", "tools", "release", "config", "geoip.dat"))) + + ips, err := loadGeoIP("CN") + common.Must(err) + + ipNet := make([]*net.IPNet, 0, 1024) + for _, ip := range ips { + if len(ip.Ip) != 4 { + continue + } + ipNet = append(ipNet, &net.IPNet{ + IP: net.IP(ip.Ip), + Mask: net.CIDRMask(int(ip.Prefix), 32), + }) + } + + b.ResetTimer() + + for i := 0; i < b.N; i++ { + for _, n := range ipNet { + if n.Contains([]byte{8, 8, 8, 8}) { + break + } + } + } +} From 482793d28a3e7b432862720c2e5b00eb54a24ce5 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Mon, 6 Nov 2017 12:23:21 +0100 Subject: [PATCH 094/229] get asset location on demand --- common/platform/platform.go | 32 +++++++++++++++----------------- common/platform/platform_test.go | 15 +++++++++++++++ 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/common/platform/platform.go b/common/platform/platform.go index 85126b70..3667992a 100644 --- a/common/platform/platform.go +++ b/common/platform/platform.go @@ -12,7 +12,7 @@ type EnvFlag struct { AltName string } -func (f EnvFlag) GetValue(defaultValue string) string { +func (f EnvFlag) GetValue(defaultValue func() string) string { if v, found := os.LookupEnv(f.Name); found { return v } @@ -22,13 +22,16 @@ func (f EnvFlag) GetValue(defaultValue string) string { } } - return defaultValue + return defaultValue() } func (f EnvFlag) GetValueAsInt(defaultValue int) int { - const PlaceHolder = "xxxxxx" - s := f.GetValue(PlaceHolder) - if s == PlaceHolder { + useDefaultValue := false + s := f.GetValue(func() string { + useDefaultValue = true + return "" + }) + if useDefaultValue { return defaultValue } v, err := strconv.ParseInt(s, 10, 32) @@ -42,18 +45,13 @@ func NormalizeEnvName(name string) string { return strings.Replace(strings.ToUpper(strings.TrimSpace(name)), ".", "_", -1) } -var assetPath = "/" - -func init() { - defAssetLocation, err := os.Executable() - if err == nil { - defAssetLocation = filepath.Dir(defAssetLocation) - assetPath = (EnvFlag{ - Name: "v2ray.location.asset", - }).GetValue(defAssetLocation) - } -} - func GetAssetLocation(file string) string { + assetPath := EnvFlag{Name: "v2ray.location.asset"}.GetValue(func() string { + exec, err := os.Executable() + if err != nil { + return "" + } + return filepath.Dir(exec) + }) return filepath.Join(assetPath, file) } diff --git a/common/platform/platform_test.go b/common/platform/platform_test.go index 6eb52acd..bfe0445b 100644 --- a/common/platform/platform_test.go +++ b/common/platform/platform_test.go @@ -1,6 +1,8 @@ package platform_test import ( + "os" + "path/filepath" "testing" . "v2ray.com/core/common/platform" @@ -39,3 +41,16 @@ func TestEnvFlag(t *testing.T) { Name: "xxxxx.y", }.GetValueAsInt(10), Equals, 10) } + +func TestGetAssetLocation(t *testing.T) { + assert := With(t) + + exec, err := os.Executable() + assert(err, IsNil) + + loc := GetAssetLocation("t") + assert(filepath.Dir(loc), Equals, filepath.Dir(exec)) + + os.Setenv("v2ray.location.asset", "/v2ray") + assert(GetAssetLocation("t"), Equals, "/v2ray/t") +} From 6b77e14bf62a6060c446ad219b61c22cc500c3a8 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Mon, 6 Nov 2017 21:12:28 +0100 Subject: [PATCH 095/229] cachable domain matcher, step 1 --- app/router/condition.go | 75 ++++++++++++++++++++++++------------ app/router/condition_test.go | 12 +++--- app/router/config.go | 19 ++------- 3 files changed, 60 insertions(+), 46 deletions(-) diff --git a/app/router/condition.go b/app/router/condition.go index 0da9ebf7..74987928 100644 --- a/app/router/condition.go +++ b/app/router/condition.go @@ -64,13 +64,35 @@ func (v *AnyCondition) Len() int { return len(*v) } -type PlainDomainMatcher string - -func NewPlainDomainMatcher(pattern string) Condition { - return PlainDomainMatcher(pattern) +type CachableDomainMatcher struct { + matchers []domainMatcher } -func (v PlainDomainMatcher) Apply(ctx context.Context) bool { +func NewCachableDomainMatcher() *CachableDomainMatcher { + return &CachableDomainMatcher{ + matchers: make([]domainMatcher, 0, 64), + } +} + +func (m *CachableDomainMatcher) Add(domain *Domain) error { + switch domain.Type { + case Domain_Plain: + m.matchers = append(m.matchers, NewPlainDomainMatcher(domain.Value)) + case Domain_Regex: + rm, err := NewRegexpDomainMatcher(domain.Value) + if err != nil { + return err + } + m.matchers = append(m.matchers, rm) + case Domain_Domain: + m.matchers = append(m.matchers, NewSubDomainMatcher(domain.Value)) + default: + return newError("unknown domain type: ", domain.Type).AtError() + } + return nil +} + +func (m *CachableDomainMatcher) Apply(ctx context.Context) bool { dest, ok := proxy.TargetFromContext(ctx) if !ok { return false @@ -80,6 +102,27 @@ func (v PlainDomainMatcher) Apply(ctx context.Context) bool { return false } domain := dest.Address.Domain() + + for _, matcher := range m.matchers { + if matcher.Apply(domain) { + return true + } + } + + return false +} + +type domainMatcher interface { + Apply(domain string) bool +} + +type PlainDomainMatcher string + +func NewPlainDomainMatcher(pattern string) PlainDomainMatcher { + return PlainDomainMatcher(pattern) +} + +func (v PlainDomainMatcher) Apply(domain string) bool { return strings.Contains(domain, string(v)) } @@ -97,33 +140,17 @@ func NewRegexpDomainMatcher(pattern string) (*RegexpDomainMatcher, error) { }, nil } -func (v *RegexpDomainMatcher) Apply(ctx context.Context) bool { - dest, ok := proxy.TargetFromContext(ctx) - if !ok { - return false - } - if !dest.Address.Family().IsDomain() { - return false - } - domain := dest.Address.Domain() +func (v *RegexpDomainMatcher) Apply(domain string) bool { return v.pattern.MatchString(strings.ToLower(domain)) } type SubDomainMatcher string -func NewSubDomainMatcher(p string) Condition { +func NewSubDomainMatcher(p string) SubDomainMatcher { return SubDomainMatcher(p) } -func (m SubDomainMatcher) Apply(ctx context.Context) bool { - dest, ok := proxy.TargetFromContext(ctx) - if !ok { - return false - } - if !dest.Address.Family().IsDomain() { - return false - } - domain := dest.Address.Domain() +func (m SubDomainMatcher) Apply(domain string) bool { pattern := string(m) if !strings.HasSuffix(domain, pattern) { return false diff --git a/app/router/condition_test.go b/app/router/condition_test.go index f0283dc3..2e35b7d7 100644 --- a/app/router/condition_test.go +++ b/app/router/condition_test.go @@ -16,32 +16,32 @@ func TestSubDomainMatcher(t *testing.T) { cases := []struct { pattern string - input context.Context + input string output bool }{ { pattern: "v2ray.com", - input: proxy.ContextWithTarget(context.Background(), net.TCPDestination(net.DomainAddress("www.v2ray.com"), 80)), + input: "www.v2ray.com", output: true, }, { pattern: "v2ray.com", - input: proxy.ContextWithTarget(context.Background(), net.TCPDestination(net.DomainAddress("v2ray.com"), 80)), + input: "v2ray.com", output: true, }, { pattern: "v2ray.com", - input: proxy.ContextWithTarget(context.Background(), net.TCPDestination(net.DomainAddress("www.v3ray.com"), 80)), + input: "www.v3ray.com", output: false, }, { pattern: "v2ray.com", - input: proxy.ContextWithTarget(context.Background(), net.TCPDestination(net.DomainAddress("2ray.com"), 80)), + input: "2ray.com", output: false, }, { pattern: "v2ray.com", - input: proxy.ContextWithTarget(context.Background(), net.TCPDestination(net.DomainAddress("xv2ray.com"), 80)), + input: "xv2ray.com", output: false, }, } diff --git a/app/router/config.go b/app/router/config.go index 048f602f..05ff3661 100644 --- a/app/router/config.go +++ b/app/router/config.go @@ -52,24 +52,11 @@ func (rr *RoutingRule) BuildCondition() (Condition, error) { conds := NewConditionChan() if len(rr.Domain) > 0 { - anyCond := NewAnyCondition() + matcher := NewCachableDomainMatcher() for _, domain := range rr.Domain { - switch domain.Type { - case Domain_Plain: - anyCond.Add(NewPlainDomainMatcher(domain.Value)) - case Domain_Regex: - matcher, err := NewRegexpDomainMatcher(domain.Value) - if err != nil { - return nil, err - } - anyCond.Add(matcher) - case Domain_Domain: - anyCond.Add(NewSubDomainMatcher(domain.Value)) - default: - panic("Unknown domain type.") - } + matcher.Add(domain) } - conds.Add(anyCond) + conds.Add(matcher) } if len(rr.Cidr) > 0 { From 57648c145c59dd621fbae0a8f059f86599b0c865 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Mon, 6 Nov 2017 22:30:56 +0100 Subject: [PATCH 096/229] cachable domain matcher: step 2 --- app/router/condition.go | 100 +++++++++++++++++++++++++++++++---- app/router/condition_test.go | 55 +++++++++++++++++++ 2 files changed, 146 insertions(+), 9 deletions(-) diff --git a/app/router/condition.go b/app/router/condition.go index 74987928..d370f691 100644 --- a/app/router/condition.go +++ b/app/router/condition.go @@ -4,6 +4,8 @@ import ( "context" "regexp" "strings" + "sync" + "time" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" @@ -64,13 +66,22 @@ func (v *AnyCondition) Len() int { return len(*v) } +type timedResult struct { + timestamp time.Time + result bool +} + type CachableDomainMatcher struct { + sync.Mutex matchers []domainMatcher + cache map[string]timedResult + lastScan time.Time } func NewCachableDomainMatcher() *CachableDomainMatcher { return &CachableDomainMatcher{ matchers: make([]domainMatcher, 0, 64), + cache: make(map[string]timedResult, 512), } } @@ -92,6 +103,85 @@ func (m *CachableDomainMatcher) Add(domain *Domain) error { return nil } +func (m *CachableDomainMatcher) applyInternal(domain string) bool { + for _, matcher := range m.matchers { + if matcher.Apply(domain) { + return true + } + } + + return false +} + +type cacheResult int + +const ( + cacheMiss cacheResult = iota + cacheHitTrue + cacheHitFalse +) + +func (m *CachableDomainMatcher) findInCache(domain string) cacheResult { + m.Lock() + defer m.Unlock() + + r, f := m.cache[domain] + if !f { + return cacheMiss + } + r.timestamp = time.Now() + m.cache[domain] = r + + if r.result { + return cacheHitTrue + } + return cacheHitFalse +} + +func (m *CachableDomainMatcher) ApplyDomain(domain string) bool { + if len(m.matchers) < 64 { + return m.applyInternal(domain) + } + + cr := m.findInCache(domain) + + if cr == cacheHitTrue { + return true + } + + if cr == cacheHitFalse { + return false + } + + r := m.applyInternal(domain) + m.Lock() + defer m.Unlock() + + m.cache[domain] = timedResult{ + result: r, + timestamp: time.Now(), + } + + now := time.Now() + if len(m.cache) > 256 && now.Sub(m.lastScan)/time.Second > 5 { + remove := make([]string, 0, 128) + + now := time.Now() + + for k, v := range m.cache { + if now.Sub(v.timestamp)/time.Second > 60 { + remove = append(remove, k) + } + } + for _, v := range remove { + delete(m.cache, v) + } + m.lastScan = now + } + + return r +} + func (m *CachableDomainMatcher) Apply(ctx context.Context) bool { dest, ok := proxy.TargetFromContext(ctx) if !ok { @@ -101,15 +191,7 @@ func (m *CachableDomainMatcher) Apply(ctx context.Context) bool { if !dest.Address.Family().IsDomain() { return false } - domain := dest.Address.Domain() - - for _, matcher := range m.matchers { - if matcher.Apply(domain) { - return true - } - } - - return false + return m.ApplyDomain(dest.Address.Domain()) } type domainMatcher interface { diff --git a/app/router/condition_test.go b/app/router/condition_test.go index 2e35b7d7..eaeac886 100644 --- a/app/router/condition_test.go +++ b/app/router/condition_test.go @@ -2,13 +2,22 @@ package router_test import ( "context" + "os" + "path/filepath" + "strconv" "testing" + "time" + proto "github.com/golang/protobuf/proto" . "v2ray.com/core/app/router" + "v2ray.com/core/common" + "v2ray.com/core/common/errors" "v2ray.com/core/common/net" + "v2ray.com/core/common/platform" "v2ray.com/core/common/protocol" "v2ray.com/core/proxy" . "v2ray.com/ext/assert" + "v2ray.com/ext/sysio" ) func TestSubDomainMatcher(t *testing.T) { @@ -179,3 +188,49 @@ func TestRoutingRule(t *testing.T) { } } } + +func loadGeoSite(country string) ([]*Domain, error) { + geositeBytes, err := sysio.ReadAsset("geosite.dat") + if err != nil { + return nil, err + } + var geositeList GeoSiteList + if err := proto.Unmarshal(geositeBytes, &geositeList); err != nil { + return nil, err + } + + for _, site := range geositeList.Entry { + if site.CountryCode == country { + return site.Domain, nil + } + } + + return nil, errors.New("country not found: " + country) +} + +func TestChinaSites(t *testing.T) { + assert := With(t) + + common.Must(sysio.CopyFile(platform.GetAssetLocation("geosite.dat"), filepath.Join(os.Getenv("GOPATH"), "src", "v2ray.com", "core", "tools", "release", "config", "geosite.dat"))) + + domains, err := loadGeoSite("CN") + assert(err, IsNil) + + matcher := NewCachableDomainMatcher() + for _, d := range domains { + assert(matcher.Add(d), IsNil) + } + + assert(matcher.ApplyDomain("163.com"), IsTrue) + assert(matcher.ApplyDomain("163.com"), IsTrue) + assert(matcher.ApplyDomain("164.com"), IsFalse) + assert(matcher.ApplyDomain("164.com"), IsFalse) + + for i := 0; i < 1024; i++ { + assert(matcher.ApplyDomain(strconv.Itoa(i)+".not-exists.com"), IsFalse) + } + time.Sleep(time.Second * 10) + for i := 0; i < 1024; i++ { + assert(matcher.ApplyDomain(strconv.Itoa(i)+".not-exists2.com"), IsFalse) + } +} From 4761139fbc9b1e31c16818d90447a4a1d38c7f48 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Mon, 6 Nov 2017 22:42:16 +0100 Subject: [PATCH 097/229] comments --- common/net/destination.go | 3 +++ common/net/net.go | 2 +- common/net/system.go | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/common/net/destination.go b/common/net/destination.go index 7709b5c9..f7f5b720 100644 --- a/common/net/destination.go +++ b/common/net/destination.go @@ -41,14 +41,17 @@ func UDPDestination(address Address, port Port) Destination { } } +// NetAddr returns the network address in this Destination in string form. func (d Destination) NetAddr() string { return d.Address.String() + ":" + d.Port.String() } +// String returns the strings form of this Destination. func (d Destination) String() string { return d.Network.URLPrefix() + ":" + d.NetAddr() } +// IsValid returns true if this Destination is valid. func (d Destination) IsValid() bool { return d.Network != Network_Unknown } diff --git a/common/net/net.go b/common/net/net.go index bd0188c2..4d41e90a 100644 --- a/common/net/net.go +++ b/common/net/net.go @@ -1,4 +1,4 @@ -// Package net contains common network utilities. +// Package net is a drop-in replacement to Golang's net package, with some more functionalities. package net //go:generate go run $GOPATH/src/v2ray.com/core/tools/generrorgen/main.go -pkg net -path Net diff --git a/common/net/system.go b/common/net/system.go index 6edc4ca4..65d7b8bb 100644 --- a/common/net/system.go +++ b/common/net/system.go @@ -2,6 +2,7 @@ package net import "net" +// DialTCP is an injectable function. Default to net.DialTCP var DialTCP = net.DialTCP var DialUDP = net.DialUDP var DialUnix = net.DialUnix From d1e7e7002ff046f8d03e483b7efaafe9364211ab Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Tue, 7 Nov 2017 11:39:54 +0100 Subject: [PATCH 098/229] fix buffer leak in crypto io --- common/crypto/io.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/common/crypto/io.go b/common/crypto/io.go index 60e593e5..cc595f17 100644 --- a/common/crypto/io.go +++ b/common/crypto/io.go @@ -51,6 +51,8 @@ func (w *CryptionWriter) Write(data []byte) (int, error) { } func (w *CryptionWriter) WriteMultiBuffer(mb buf.MultiBuffer) error { + defer mb.Release() + bs := mb.ToNetBuffers() for _, b := range bs { w.stream.XORKeyStream(b, b) From ccf1fb66166785636f392afb4e918d7b1539898c Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Tue, 7 Nov 2017 11:40:12 +0100 Subject: [PATCH 099/229] fix buffer leak in multi buffer --- common/buf/multi_buffer.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/common/buf/multi_buffer.go b/common/buf/multi_buffer.go index f7422808..b0babf88 100644 --- a/common/buf/multi_buffer.go +++ b/common/buf/multi_buffer.go @@ -4,6 +4,7 @@ import ( "io" "net" + "v2ray.com/core/common" "v2ray.com/core/common/errors" ) @@ -34,13 +35,14 @@ func ReadAllToMultiBuffer(reader io.Reader) (MultiBuffer, error) { } } +// ReadAllToBytes reads all content from the reader into a byte array, until EOF. func ReadAllToBytes(reader io.Reader) ([]byte, error) { mb, err := ReadAllToMultiBuffer(reader) if err != nil { return nil, err } b := make([]byte, mb.Len()) - mb.Read(b) + common.Must2(mb.Read(b)) mb.Release() return b, nil } @@ -131,11 +133,12 @@ func (mb MultiBuffer) IsEmpty() bool { } // Release releases all Buffers in the MultiBuffer. -func (mb MultiBuffer) Release() { - for i, b := range mb { +func (mb *MultiBuffer) Release() { + for i, b := range *mb { b.Release() - mb[i] = nil + (*mb)[i] = nil } + *mb = (*mb)[:0] } // ToNetBuffers converts this MultiBuffer to net.Buffers. The return net.Buffers points to the same content of the MultiBuffer. @@ -158,6 +161,7 @@ func (mb *MultiBuffer) SliceBySize(size int) MultiBuffer { } sliceSize += b.Len() slice.Append(b) + (*mb)[i] = nil } *mb = (*mb)[endIndex:] return slice @@ -168,6 +172,7 @@ func (mb *MultiBuffer) SplitFirst() *Buffer { return nil } b := (*mb)[0] + (*mb)[0] = nil *mb = (*mb)[1:] return b } From c1eccb3a45f5278e6d4ff48b5bb353dc711d94cb Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Tue, 7 Nov 2017 11:58:43 +0100 Subject: [PATCH 100/229] safe release buffer --- app/proxyman/mux/writer.go | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/app/proxyman/mux/writer.go b/app/proxyman/mux/writer.go index 116af25a..095898d2 100644 --- a/app/proxyman/mux/writer.go +++ b/app/proxyman/mux/writer.go @@ -82,23 +82,21 @@ func (w *Writer) writeData(mb buf.MultiBuffer) error { // Write implements buf.MultiBufferWriter. func (w *Writer) Write(mb buf.MultiBuffer) error { + defer mb.Release() + if mb.IsEmpty() { return w.writeMetaOnly() } - if w.transferType == protocol.TransferTypeStream { - const chunkSize = 8 * 1024 - for !mb.IsEmpty() { - slice := mb.SliceBySize(chunkSize) - if err := w.writeData(slice); err != nil { - return err - } + for !mb.IsEmpty() { + var chunk buf.MultiBuffer + if w.transferType == protocol.TransferTypeStream { + chunk = mb.SliceBySize(8 * 1024) + } else { + chunk = buf.NewMultiBufferValue(mb.SplitFirst()) } - } else { - for _, b := range mb { - if err := w.writeData(buf.NewMultiBufferValue(b)); err != nil { - return err - } + if err := w.writeData(chunk); err != nil { + return err } } From 251d6f6fcb86355d11d3b82474bbae3435e1425b Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Tue, 7 Nov 2017 13:07:50 +0100 Subject: [PATCH 101/229] fix lint warning --- common/crypto/auth.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/crypto/auth.go b/common/crypto/auth.go index d268809f..f9fccd24 100644 --- a/common/crypto/auth.go +++ b/common/crypto/auth.go @@ -93,7 +93,7 @@ func (r *AuthenticationReader) readSize() error { sizeBytes := r.sizeParser.SizeBytes() if r.buffer.Len() < sizeBytes { - r.buffer.Reset(buf.ReadFrom(r.buffer)) + common.Must(r.buffer.Reset(buf.ReadFrom(r.buffer))) delta := sizeBytes - r.buffer.Len() if err := r.buffer.AppendSupplier(buf.ReadAtLeastFrom(r.reader, delta)); err != nil { return err From f5d76c8eb0dabc081a55261c22b8c27d05848e03 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Tue, 7 Nov 2017 14:40:51 +0100 Subject: [PATCH 102/229] fix lint warnings --- common/crypto/auth.go | 7 ++++++- common/crypto/chunk.go | 19 +++++++++++-------- testing/scenarios/vmess_test.go | 4 +++- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/common/crypto/auth.go b/common/crypto/auth.go index f9fccd24..4c619cdb 100644 --- a/common/crypto/auth.go +++ b/common/crypto/auth.go @@ -93,7 +93,12 @@ func (r *AuthenticationReader) readSize() error { sizeBytes := r.sizeParser.SizeBytes() if r.buffer.Len() < sizeBytes { - common.Must(r.buffer.Reset(buf.ReadFrom(r.buffer))) + if r.buffer.IsEmpty() { + r.buffer.Clear() + } else { + common.Must(r.buffer.Reset(buf.ReadFrom(r.buffer))) + } + delta := sizeBytes - r.buffer.Len() if err := r.buffer.AppendSupplier(buf.ReadAtLeastFrom(r.reader, delta)); err != nil { return err diff --git a/common/crypto/chunk.go b/common/crypto/chunk.go index 5b44640c..b3368c10 100644 --- a/common/crypto/chunk.go +++ b/common/crypto/chunk.go @@ -3,6 +3,7 @@ package crypto import ( "io" + "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/serial" ) @@ -70,7 +71,7 @@ func (r *ChunkStreamReader) readSize() (uint16, error) { return 0, err } } - r.leftOver.Read(r.buffer) + common.Must2(r.leftOver.Read(r.buffer)) return r.sizeDecoder.Decode(r.buffer) } @@ -93,21 +94,23 @@ func (r *ChunkStreamReader) Read() (buf.MultiBuffer, error) { } } - if size >= r.leftOver.Len() { + leftOverLen := r.leftOver.Len() + if size >= leftOverLen { mb := r.leftOver - r.leftOverSize = size - r.leftOver.Len() + r.leftOverSize = size - leftOverLen r.leftOver = nil return mb, nil } mb := r.leftOver.SliceBySize(size) - if mb.Len() != size { + mbLen := mb.Len() + if mbLen != size { b := buf.New() - b.AppendSupplier(buf.ReadFullFrom(&r.leftOver, size-mb.Len())) + common.Must(b.Reset(buf.ReadFullFrom(&r.leftOver, size-mbLen))) mb.Append(b) } - r.leftOverSize = 0 + return mb, nil } @@ -131,10 +134,10 @@ func (w *ChunkStreamWriter) Write(mb buf.MultiBuffer) error { slice := mb.SliceBySize(sliceSize) b := buf.New() - b.AppendSupplier(func(buffer []byte) (int, error) { + common.Must(b.AppendSupplier(func(buffer []byte) (int, error) { w.sizeEncoder.Encode(uint16(slice.Len()), buffer[:0]) return w.sizeEncoder.SizeBytes(), nil - }) + })) mb2Write.Append(b) mb2Write.AppendMulti(slice) diff --git a/testing/scenarios/vmess_test.go b/testing/scenarios/vmess_test.go index 0a10669e..04b04356 100644 --- a/testing/scenarios/vmess_test.go +++ b/testing/scenarios/vmess_test.go @@ -637,6 +637,8 @@ func TestVMessNone(t *testing.T) { wg.Add(10) for i := 0; i < 10; i++ { go func() { + defer wg.Done() + conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{ IP: []byte{127, 0, 0, 1}, Port: int(clientPort), @@ -651,9 +653,9 @@ func TestVMessNone(t *testing.T) { assert(nBytes, Equals, len(payload)) response := readFrom(conn, time.Second*20, 1024*1024) + assert(response, Equals, xor(payload)) assert(conn.Close(), IsNil) - wg.Done() }() } wg.Wait() From 1b6b39faad8e29794a0c66577178dcb4a9a89b10 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Tue, 7 Nov 2017 15:02:21 +0100 Subject: [PATCH 103/229] comments --- common/buf/multi_buffer.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/common/buf/multi_buffer.go b/common/buf/multi_buffer.go index b0babf88..12c995a2 100644 --- a/common/buf/multi_buffer.go +++ b/common/buf/multi_buffer.go @@ -8,10 +8,12 @@ import ( "v2ray.com/core/common/errors" ) +// MultiBufferWriter is a writer that writes MultiBuffer. type MultiBufferWriter interface { WriteMultiBuffer(MultiBuffer) error } +// MultiBufferReader is a reader that reader payload as MultiBuffer. type MultiBufferReader interface { ReadMultiBuffer() (MultiBuffer, error) } @@ -60,14 +62,17 @@ func NewMultiBufferValue(b ...*Buffer) MultiBuffer { return MultiBuffer(b) } +// Append appends buffer to the end of this MultiBuffer func (mb *MultiBuffer) Append(buf *Buffer) { *mb = append(*mb, buf) } +// AppendMulti appends a MultiBuffer to the end of this one. func (mb *MultiBuffer) AppendMulti(buf MultiBuffer) { *mb = append(*mb, buf...) } +// Copy copied the begining part of the MultiBuffer into the given byte array. func (mb MultiBuffer) Copy(b []byte) int { total := 0 for _, bb := range mb { @@ -80,6 +85,7 @@ func (mb MultiBuffer) Copy(b []byte) int { return total } +// Read implements io.Reader. func (mb *MultiBuffer) Read(b []byte) (int, error) { endIndex := len(*mb) totalBytes := 0 @@ -98,6 +104,7 @@ func (mb *MultiBuffer) Read(b []byte) (int, error) { return totalBytes, nil } +// Write implements io.Writer. func (mb *MultiBuffer) Write(b []byte) { n := len(*mb) if n > 0 && !(*mb)[n-1].IsFull() { From e1c8ffd37887b6250680a6122f546cfaf112ffda Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Tue, 7 Nov 2017 15:25:58 +0100 Subject: [PATCH 104/229] put systemd unit file into /etc/systemd/system. fix #623 --- release/install-release.sh | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/release/install-release.sh b/release/install-release.sh index e2564ead..2b498df2 100755 --- a/release/install-release.sh +++ b/release/install-release.sh @@ -171,7 +171,7 @@ stopV2ray(){ SERVICE_CMD=$(command -v service) colorEcho ${BLUE} "Shutting down V2Ray service." - if [[ -n "${SYSTEMCTL_CMD}" ]] || [[ -f "/lib/systemd/system/v2ray.service" ]]; then + if [[ -n "${SYSTEMCTL_CMD}" ]] || [[ -f "/lib/systemd/system/v2ray.service" ]] || [[ -f "/etc/systemd/system/v2ray.service" ]]; then ${SYSTEMCTL_CMD} stop v2ray elif [[ -n "${SERVICE_CMD}" ]] || [[ -f "/etc/init.d/v2ray" ]]; then ${SERVICE_CMD} v2ray stop @@ -185,6 +185,8 @@ startV2ray(){ if [ -n "${SYSTEMCTL_CMD}" ] && [ -f "/lib/systemd/system/v2ray.service" ]; then ${SYSTEMCTL_CMD} start v2ray + elif [ -n "${SYSTEMCTL_CMD}" ] && [ -f "/etc/systemd/system/v2ray.service" ]; then + ${SYSTEMCTL_CMD} start v2ray elif [ -n "${SERVICE_CMD}" ] && [ -f "/etc/init.d/v2ray" ]; then ${SERVICE_CMD} v2ray start fi @@ -244,9 +246,11 @@ installInitScrip(){ SERVICE_CMD=$(command -v service) if [[ -n "${SYSTEMCTL_CMD}" ]];then - if [[ ! -f "/lib/systemd/system/v2ray.service" ]]; then - cp "/tmp/v2ray/v2ray-${NEW_VER}-linux-${VDIS}/systemd/v2ray.service" "/lib/systemd/system/" - systemctl enable v2ray.service + if [[ ! -f "/etc/systemd/system/v2ray.service" ]]; then + if [[ ! -f "/lib/systemd/system/v2ray.service" ]]; then + cp "/tmp/v2ray/v2ray-${NEW_VER}-linux-${VDIS}/systemd/v2ray.service" "/etc/systemd/system/" + systemctl enable v2ray.service + fi fi return elif [[ -n "${SERVICE_CMD}" ]] && [[ ! -f "/etc/init.d/v2ray" ]]; then @@ -273,7 +277,21 @@ Help(){ remove(){ SYSTEMCTL_CMD=$(command -v systemctl) SERVICE_CMD=$(command -v service) - if [[ -n "${SYSTEMCTL_CMD}" ]] && [[ -f "/lib/systemd/system/v2ray.service" ]];then + if [[ -n "${SYSTEMCTL_CMD}" ]] && [[ -f "/etc/systemd/system/v2ray.service" ]];then + if pgrep "v2ray" > /dev/null ; then + stopV2ray + fi + systemctl disable v2ray.service + rm -rf "/usr/bin/v2ray" "/etc/systemd/system/v2ray.service" + if [[ $? -ne 0 ]]; then + colorEcho ${RED} "Failed to remove V2Ray." + exit + else + colorEcho ${GREEN} "Removed V2Ray successfully." + colorEcho ${GREEN} "If necessary, please remove configuration file and log file manually." + exit + fi + elif [[ -n "${SYSTEMCTL_CMD}" ]] && [[ -f "/lib/systemd/system/v2ray.service" ]];then if pgrep "v2ray" > /dev/null ; then stopV2ray fi From d9ce03d25be959f19875f1a60872f405451f0eb5 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Tue, 7 Nov 2017 16:21:36 +0100 Subject: [PATCH 105/229] test case for geoip:cn --- common/net/ipnet_test.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/common/net/ipnet_test.go b/common/net/ipnet_test.go index 572c4ed1..2943e59a 100644 --- a/common/net/ipnet_test.go +++ b/common/net/ipnet_test.go @@ -52,6 +52,21 @@ func TestIPNet(t *testing.T) { assert(ipNet.Contains(ParseIP("91.108.255.254")), IsTrue) } +func TestGeoIPCN(t *testing.T) { + assert := With(t) + common.Must(sysio.CopyFile(platform.GetAssetLocation("geoip.dat"), filepath.Join(os.Getenv("GOPATH"), "src", "v2ray.com", "core", "tools", "release", "config", "geoip.dat"))) + + ips, err := loadGeoIP("CN") + common.Must(err) + + ipNet := NewIPNetTable() + for _, ip := range ips { + ipNet.AddIP(ip.Ip, byte(ip.Prefix)) + } + + assert(ipNet.Contains([]byte{8, 8, 8, 8}), IsFalse) +} + func loadGeoIP(country string) ([]*router.CIDR, error) { geoipBytes, err := sysio.ReadAsset("geoip.dat") if err != nil { From 8554a5e0bf8bd663984576fdf7e5b23a5159d1a7 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Tue, 7 Nov 2017 16:28:39 +0100 Subject: [PATCH 106/229] fix buffer leak --- common/buf/multi_buffer.go | 1 + 1 file changed, 1 insertion(+) diff --git a/common/buf/multi_buffer.go b/common/buf/multi_buffer.go index 12c995a2..ca5d5d45 100644 --- a/common/buf/multi_buffer.go +++ b/common/buf/multi_buffer.go @@ -95,6 +95,7 @@ func (mb *MultiBuffer) Read(b []byte) (int, error) { b = b[nBytes:] if bb.IsEmpty() { bb.Release() + (*mb)[i] = nil } else { endIndex = i break From 7cd2d62d06b64c892662d9751cfb9031eacc0801 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Tue, 7 Nov 2017 16:53:02 +0100 Subject: [PATCH 107/229] release buffer on error --- common/buf/multi_buffer.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/common/buf/multi_buffer.go b/common/buf/multi_buffer.go index ca5d5d45..563e3ab3 100644 --- a/common/buf/multi_buffer.go +++ b/common/buf/multi_buffer.go @@ -18,13 +18,16 @@ type MultiBufferReader interface { ReadMultiBuffer() (MultiBuffer, error) } +// ReadAllToMultiBuffer reads all content from the reader into a MultiBuffer, until EOF. func ReadAllToMultiBuffer(reader io.Reader) (MultiBuffer, error) { mb := NewMultiBuffer() for { b := New() - err := b.AppendSupplier(ReadFrom(reader)) - if !b.IsEmpty() { + err := b.Reset(ReadFrom(reader)) + if b.IsEmpty() { + b.Release() + } else { mb.Append(b) } if err != nil { From cab5c10fc2d510296fa1c88d336067b3ca7d15bb Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Tue, 7 Nov 2017 22:31:47 +0100 Subject: [PATCH 108/229] remove use of KeepAlive --- app/proxyman/mux/writer.go | 12 ++++-------- proxy/dokodemo/dokodemo.go | 3 --- proxy/freedom/freedom.go | 3 --- proxy/http/server.go | 3 --- proxy/shadowsocks/client.go | 3 --- proxy/shadowsocks/server.go | 3 --- proxy/socks/client.go | 3 --- proxy/socks/server.go | 3 --- proxy/vmess/inbound/inbound.go | 3 --- proxy/vmess/outbound/outbound.go | 2 -- 10 files changed, 4 insertions(+), 34 deletions(-) diff --git a/app/proxyman/mux/writer.go b/app/proxyman/mux/writer.go index 095898d2..cee325e8 100644 --- a/app/proxyman/mux/writer.go +++ b/app/proxyman/mux/writer.go @@ -1,8 +1,7 @@ package mux import ( - "runtime" - + "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" @@ -54,10 +53,9 @@ func (w *Writer) getNextFrameMeta() FrameMetadata { func (w *Writer) writeMetaOnly() error { meta := w.getNextFrameMeta() b := buf.New() - if err := b.AppendSupplier(meta.AsSupplier()); err != nil { + if err := b.Reset(meta.AsSupplier()); err != nil { return err } - runtime.KeepAlive(meta) return w.writer.Write(buf.NewMultiBufferValue(b)) } @@ -66,10 +64,9 @@ func (w *Writer) writeData(mb buf.MultiBuffer) error { meta.Option.Set(OptionData) frame := buf.New() - if err := frame.AppendSupplier(meta.AsSupplier()); err != nil { + if err := frame.Reset(meta.AsSupplier()); err != nil { return err } - runtime.KeepAlive(meta) if err := frame.AppendSupplier(serial.WriteUint16(uint16(mb.Len()))); err != nil { return err } @@ -110,8 +107,7 @@ func (w *Writer) Close() { } frame := buf.New() - frame.AppendSupplier(meta.AsSupplier()) - runtime.KeepAlive(meta) + common.Must(frame.Reset(meta.AsSupplier())) w.writer.Write(buf.NewMultiBufferValue(frame)) } diff --git a/proxy/dokodemo/dokodemo.go b/proxy/dokodemo/dokodemo.go index 0c4136d3..62a31395 100644 --- a/proxy/dokodemo/dokodemo.go +++ b/proxy/dokodemo/dokodemo.go @@ -4,7 +4,6 @@ package dokodemo import ( "context" - "runtime" "time" "v2ray.com/core/app" @@ -117,8 +116,6 @@ func (d *DokodemoDoor) Process(ctx context.Context, network net.Network, conn in return newError("connection ends").Base(err) } - runtime.KeepAlive(timer) - return nil } diff --git a/proxy/freedom/freedom.go b/proxy/freedom/freedom.go index 7df958b7..bc5644c7 100644 --- a/proxy/freedom/freedom.go +++ b/proxy/freedom/freedom.go @@ -4,7 +4,6 @@ package freedom import ( "context" - "runtime" "time" "v2ray.com/core/app" @@ -139,8 +138,6 @@ func (v *Handler) Process(ctx context.Context, outboundRay ray.OutboundRay, dial return newError("connection ends").Base(err) } - runtime.KeepAlive(timer) - return nil } diff --git a/proxy/http/server.go b/proxy/http/server.go index 746ef204..9c3f06af 100644 --- a/proxy/http/server.go +++ b/proxy/http/server.go @@ -6,7 +6,6 @@ import ( "encoding/base64" "io" "net/http" - "runtime" "strconv" "strings" "time" @@ -185,8 +184,6 @@ func (s *Server) handleConnect(ctx context.Context, request *http.Request, reade return newError("connection ends").Base(err) } - runtime.KeepAlive(timer) - return nil } diff --git a/proxy/shadowsocks/client.go b/proxy/shadowsocks/client.go index 8177fa08..0470b646 100644 --- a/proxy/shadowsocks/client.go +++ b/proxy/shadowsocks/client.go @@ -2,7 +2,6 @@ package shadowsocks import ( "context" - "runtime" "time" "v2ray.com/core/app/log" @@ -168,8 +167,6 @@ func (v *Client) Process(ctx context.Context, outboundRay ray.OutboundRay, diale return nil } - runtime.KeepAlive(timer) - return nil } diff --git a/proxy/shadowsocks/server.go b/proxy/shadowsocks/server.go index 509291dc..be28b5dd 100644 --- a/proxy/shadowsocks/server.go +++ b/proxy/shadowsocks/server.go @@ -2,7 +2,6 @@ package shadowsocks import ( "context" - "runtime" "time" "v2ray.com/core/app" @@ -197,8 +196,6 @@ func (s *Server) handleConnection(ctx context.Context, conn internet.Connection, return newError("connection ends").Base(err) } - runtime.KeepAlive(timer) - return nil } diff --git a/proxy/socks/client.go b/proxy/socks/client.go index e227e3b2..49226273 100644 --- a/proxy/socks/client.go +++ b/proxy/socks/client.go @@ -2,7 +2,6 @@ package socks import ( "context" - "runtime" "time" "v2ray.com/core/common" @@ -118,8 +117,6 @@ func (c *Client) Process(ctx context.Context, ray ray.OutboundRay, dialer proxy. return newError("connection ends").Base(err) } - runtime.KeepAlive(timer) - return nil } diff --git a/proxy/socks/server.go b/proxy/socks/server.go index 8bb2eeda..defa7791 100644 --- a/proxy/socks/server.go +++ b/proxy/socks/server.go @@ -3,7 +3,6 @@ package socks import ( "context" "io" - "runtime" "time" "v2ray.com/core/app" @@ -143,8 +142,6 @@ func (v *Server) transport(ctx context.Context, reader io.Reader, writer io.Writ return newError("connection ends").Base(err) } - runtime.KeepAlive(timer) - return nil } diff --git a/proxy/vmess/inbound/inbound.go b/proxy/vmess/inbound/inbound.go index 9cc3c275..877e51ea 100644 --- a/proxy/vmess/inbound/inbound.go +++ b/proxy/vmess/inbound/inbound.go @@ -5,7 +5,6 @@ package inbound import ( "context" "io" - "runtime" "sync" "time" @@ -236,8 +235,6 @@ func (v *Handler) Process(ctx context.Context, network net.Network, connection i return newError("connection ends").Base(err) } - runtime.KeepAlive(timer) - return nil } diff --git a/proxy/vmess/outbound/outbound.go b/proxy/vmess/outbound/outbound.go index 62e33149..3e395254 100644 --- a/proxy/vmess/outbound/outbound.go +++ b/proxy/vmess/outbound/outbound.go @@ -4,7 +4,6 @@ package outbound import ( "context" - "runtime" "time" "v2ray.com/core/app" @@ -162,7 +161,6 @@ func (v *Handler) Process(ctx context.Context, outboundRay ray.OutboundRay, dial if err := signal.ErrorOrFinish2(ctx, requestDone, responseDone); err != nil { return newError("connection ends").Base(err) } - runtime.KeepAlive(timer) return nil } From ead3fa09e5cd9720db5ec39195c6575e6e4663d4 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Tue, 7 Nov 2017 22:33:16 +0100 Subject: [PATCH 109/229] release buffer on error --- app/proxyman/mux/reader.go | 1 + 1 file changed, 1 insertion(+) diff --git a/app/proxyman/mux/reader.go b/app/proxyman/mux/reader.go index 5b01a490..298eec05 100644 --- a/app/proxyman/mux/reader.go +++ b/app/proxyman/mux/reader.go @@ -104,6 +104,7 @@ func (r *StreamReader) Read() (buf.MultiBuffer, error) { if err := b.AppendSupplier(func(bb []byte) (int, error) { return r.reader.Read(bb[:readLen]) }); err != nil { + b.Release() mb.Release() return nil, err } From 143488ad8c0634045bd35182a0037d75c276e8a9 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Tue, 7 Nov 2017 23:28:11 +0100 Subject: [PATCH 110/229] update geosite data --- tools/release/config/geosite.dat | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tools/release/config/geosite.dat b/tools/release/config/geosite.dat index 384de846..b66d6212 100755 --- a/tools/release/config/geosite.dat +++ b/tools/release/config/geosite.dat @@ -1,5 +1,5 @@ -; +; CNcn xn--fiqs8s  10010.com 100offer.com 115.com 123juzi.com 123juzi.net 123u.com 126.com 126.net 127.net 163.com  17173.com  17cdn.com 188.com 1905.com 21cn.com 2288.org 2345.com 263.net 2cto.com 3322.org 35.com @@ -30,7 +30,7 @@ cubead.com  dajie.com dajieimg.com dangdang.com daocloud.io diopic.net  docin.com dockerone.com dockone.io donews.com -douban.com doubanio.com +douban.com  douban.fm doubanio.com dpfile.com duomai.com duoshuo.com duowan.com dxpmedia.com eastday.com @@ -42,7 +42,7 @@ haosou.com  hdslb.com  henha.com henkuai.com  hexun.com hi ifanrx.com  ifeng.com ifengimg.com ijinshan.com ikafan.com imedao.com imgo.tv  imooc.com  infoq.cominfoqstatic.com  ip138.com ipinyou.com ipip.net -ip-cdn.com  iqiyi.com  it165.net  it168.com  it610.com  iteye.com +ip-cdn.com  iqiyi.com  irs01.com  it165.net  it168.com  it610.com  iteye.com ithome.com itjuzi.com jandan.net @@ -76,8 +76,8 @@ pchome.net pingan.compingplusplus.com pps.tv psbc.com pubyun.com qbox.me -qcloud.com  qhimg.comqiaobutang.com -qidian.com qingcloud.comqingsongchou.com  qiniu.com qiniucdn.com qiniudn.com qiniudns.com qiyi.com qiyipic.com +qcloud.com  qhimg.com  qhres.comqiaobutang.com +qidian.com qihucdn.com qingcloud.comqingsongchou.com  qiniu.com qiniucdn.com qiniudn.com qiniudns.com qiyi.com qiyipic.com qtmojo.com qq.com qqmail.com  qunar.com qunarzz.com  qzone.com @@ -101,7 +101,7 @@ xiaomi.com xitu.com xinhuanet.com xinshipu.com xiu8.com  xueqiu.com xunlei.com xywy.com yaolan.com  yccdn.com -yeepay.com  yesky.com  yigao.com yihaodian.comyihaodianimg.comyingjiesheng.com yinxiang.com yixi.tv  yjbys.com yhd.com +yeepay.com  yesky.com  yigao.com yihaodian.comyihaodianimg.comyingjiesheng.com yinxiang.com yinyuetai.com yixi.tv  yjbys.com yhd.com youboy.com  youku.com yunba.io yundaex.com yunshipei.com  yupoo.com  yuzua.com yy.com yytcdn.com From 9cc9a76b71669dec1e8fcdbef9cc31c9acd14ce0 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Wed, 8 Nov 2017 11:11:13 +0100 Subject: [PATCH 111/229] cleanup --- common/crypto/chunk.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/common/crypto/chunk.go b/common/crypto/chunk.go index b3368c10..0fc89db8 100644 --- a/common/crypto/chunk.go +++ b/common/crypto/chunk.go @@ -8,11 +8,13 @@ import ( "v2ray.com/core/common/serial" ) +// ChunkSizeDecoder is an utility class to decode size value from bytes. type ChunkSizeDecoder interface { SizeBytes() int Decode([]byte) (uint16, error) } +// ChunkSizeEncoder is an utility class to encode size value into bytes. type ChunkSizeEncoder interface { SizeBytes() int Encode(uint16, []byte) []byte @@ -134,7 +136,7 @@ func (w *ChunkStreamWriter) Write(mb buf.MultiBuffer) error { slice := mb.SliceBySize(sliceSize) b := buf.New() - common.Must(b.AppendSupplier(func(buffer []byte) (int, error) { + common.Must(b.Reset(func(buffer []byte) (int, error) { w.sizeEncoder.Encode(uint16(slice.Len()), buffer[:0]) return w.sizeEncoder.SizeBytes(), nil })) From 2a96aaaf7bbcdf05c0a219c0dfbc048f80772b76 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Wed, 8 Nov 2017 18:14:44 +0100 Subject: [PATCH 112/229] comments --- common/buf/io.go | 1 + common/buf/multi_buffer.go | 2 ++ common/buf/writer.go | 5 ++++- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/common/buf/io.go b/common/buf/io.go index c66a1f78..d82795cd 100644 --- a/common/buf/io.go +++ b/common/buf/io.go @@ -14,6 +14,7 @@ type Reader interface { // ErrReadTimeout is an error that happens with IO timeout. var ErrReadTimeout = newError("IO timeout") +// TimeoutReader is a reader that returns error if Read() operation takes longer than the given timeout. type TimeoutReader interface { ReadTimeout(time.Duration) (MultiBuffer, error) } diff --git a/common/buf/multi_buffer.go b/common/buf/multi_buffer.go index 563e3ab3..5a684fa4 100644 --- a/common/buf/multi_buffer.go +++ b/common/buf/multi_buffer.go @@ -161,6 +161,7 @@ func (mb MultiBuffer) ToNetBuffers() net.Buffers { return bs } +// SliceBySize splits the begining of this MultiBuffer into another one, for at most size bytes. func (mb *MultiBuffer) SliceBySize(size int) MultiBuffer { slice := NewMultiBuffer() sliceSize := 0 @@ -178,6 +179,7 @@ func (mb *MultiBuffer) SliceBySize(size int) MultiBuffer { return slice } +// SplitFirst splits out the first Buffer in this MultiBuffer. func (mb *MultiBuffer) SplitFirst() *Buffer { if len(*mb) == 0 { return nil diff --git a/common/buf/writer.go b/common/buf/writer.go index 3944382a..6b63e6a7 100644 --- a/common/buf/writer.go +++ b/common/buf/writer.go @@ -137,6 +137,9 @@ func (noOpBytesWriter) ReadFrom(reader io.Reader) (int64, error) { } var ( - Discard Writer = noOpWriter{} + // Discard is a Writer that swallows all contents written in. + Discard Writer = noOpWriter{} + + // DiscardBytes is an io.Writer that swallows all contents written in. DiscardBytes io.Writer = noOpBytesWriter{} ) From 14bc183754197faaa7fdead60f23ce972d7943c8 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Wed, 8 Nov 2017 21:33:41 +0100 Subject: [PATCH 113/229] update arch values --- release/install-release.sh | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/release/install-release.sh b/release/install-release.sh index 2b498df2..22f1d8af 100755 --- a/release/install-release.sh +++ b/release/install-release.sh @@ -75,6 +75,14 @@ sysArch(){ VDIS="arm" elif [[ "$ARCH" == *"armv8"* ]] || [[ "$ARCH" == "aarch64" ]]; then VDIS="arm64" + elif [[ "$ARCH" == *"mips64le"* ]]; then + VDIS="mips64le" + elif [[ "$ARCH" == *"mips64"* ]]; then + VDIS="mips64" + elif [[ "$ARCH" == *"mipsle"* ]]; then + VDIS="mipsle" + elif [[ "$ARCH" == *"mips"* ]]; then + VDIS="mips" fi return 0 } From d5fd7efa7e6ee9a7e82097bc14d03821b21faca9 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Wed, 8 Nov 2017 22:23:21 +0100 Subject: [PATCH 114/229] fast read on first packet --- common/buf/io.go | 12 ------------ common/buf/reader.go | 22 ++++++++++++++++++++++ common/buf/reader_test.go | 9 +++++---- transport/internet/tls/tls.go | 2 +- transport/internet/websocket/connection.go | 2 +- 5 files changed, 29 insertions(+), 18 deletions(-) diff --git a/common/buf/io.go b/common/buf/io.go index d82795cd..a7abeff1 100644 --- a/common/buf/io.go +++ b/common/buf/io.go @@ -57,18 +57,6 @@ func NewReader(reader io.Reader) Reader { return &BytesToBufferReader{ reader: reader, - buffer: make([]byte, 32*1024), - } -} - -func NewMergingReader(reader io.Reader) Reader { - return NewMergingReaderSize(reader, 32*1024) -} - -func NewMergingReaderSize(reader io.Reader, size uint32) Reader { - return &BytesToBufferReader{ - reader: reader, - buffer: make([]byte, size), } } diff --git a/common/buf/reader.go b/common/buf/reader.go index cade2a78..8715075a 100644 --- a/common/buf/reader.go +++ b/common/buf/reader.go @@ -12,8 +12,30 @@ type BytesToBufferReader struct { buffer []byte } +func NewBytesToBufferReader(reader io.Reader) Reader { + return &BytesToBufferReader{ + reader: reader, + } +} + +func (r *BytesToBufferReader) readSmall() (MultiBuffer, error) { + b := New() + if err := b.Reset(ReadFrom(r.reader)); err != nil { + b.Release() + return nil, err + } + if b.IsFull() { + r.buffer = make([]byte, 32*1024) + } + return NewMultiBufferValue(b), nil +} + // Read implements Reader.Read(). func (r *BytesToBufferReader) Read() (MultiBuffer, error) { + if r.buffer == nil { + return r.readSmall() + } + nBytes, err := r.reader.Read(r.buffer) if err != nil { return nil, err diff --git a/common/buf/reader_test.go b/common/buf/reader_test.go index 7c79d0fd..f33ed4ce 100644 --- a/common/buf/reader_test.go +++ b/common/buf/reader_test.go @@ -14,12 +14,13 @@ import ( func TestAdaptiveReader(t *testing.T) { assert := With(t) - rawContent := make([]byte, 1024*1024) - buffer := bytes.NewBuffer(rawContent) - - reader := NewReader(buffer) + reader := NewReader(bytes.NewReader(make([]byte, 1024*1024))) b, err := reader.Read() assert(err, IsNil) + assert(b.Len(), Equals, 2*1024) + + b, err = reader.Read() + assert(err, IsNil) assert(b.Len(), Equals, 32*1024) } diff --git a/transport/internet/tls/tls.go b/transport/internet/tls/tls.go index 12f5a155..42ade5f7 100644 --- a/transport/internet/tls/tls.go +++ b/transport/internet/tls/tls.go @@ -23,7 +23,7 @@ type conn struct { func (c *conn) ReadMultiBuffer() (buf.MultiBuffer, error) { if c.mergingReader == nil { - c.mergingReader = buf.NewMergingReaderSize(c.Conn, 16*1024) + c.mergingReader = buf.NewBytesToBufferReader(c.Conn) } return c.mergingReader.Read() } diff --git a/transport/internet/websocket/connection.go b/transport/internet/websocket/connection.go index 123621aa..bcdde3cf 100644 --- a/transport/internet/websocket/connection.go +++ b/transport/internet/websocket/connection.go @@ -49,7 +49,7 @@ func (c *connection) Read(b []byte) (int, error) { func (c *connection) ReadMultiBuffer() (buf.MultiBuffer, error) { if c.mergingReader == nil { - c.mergingReader = buf.NewMergingReader(c) + c.mergingReader = buf.NewBytesToBufferReader(c) } return c.mergingReader.Read() } From cf080e806106159c8cd96a4fe23b198f0b8b1e81 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Wed, 8 Nov 2017 22:41:46 +0100 Subject: [PATCH 115/229] ensure buffer is completely filled in --- common/crypto/chunk.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/crypto/chunk.go b/common/crypto/chunk.go index 0fc89db8..f284ef19 100644 --- a/common/crypto/chunk.go +++ b/common/crypto/chunk.go @@ -73,7 +73,7 @@ func (r *ChunkStreamReader) readSize() (uint16, error) { return 0, err } } - common.Must2(r.leftOver.Read(r.buffer)) + common.Must2(io.ReadFull(&r.leftOver, r.buffer)) return r.sizeDecoder.Decode(r.buffer) } From 3d2fd372e1d7c7624bdcf238c220ecb93f07c920 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Wed, 8 Nov 2017 23:43:16 +0100 Subject: [PATCH 116/229] avoid writing empty payload in bytesToBufferWriter --- common/buf/writer.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/common/buf/writer.go b/common/buf/writer.go index 6b63e6a7..36fa0edc 100644 --- a/common/buf/writer.go +++ b/common/buf/writer.go @@ -90,11 +90,10 @@ func (w *bytesToBufferWriter) WriteMultiBuffer(mb MultiBuffer) error { func (w *bytesToBufferWriter) ReadFrom(reader io.Reader) (int64, error) { mbReader := NewReader(reader) totalBytes := int64(0) - eof := false - for !eof { + for { mb, err := mbReader.Read() - if err == io.EOF { - eof = true + if errors.Cause(err) == io.EOF { + break } else if err != nil { return totalBytes, err } From 66b82e4ab7cd4a79c2e603352728f70936cfdfcc Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Thu, 9 Nov 2017 00:55:28 +0100 Subject: [PATCH 117/229] cleanup MultiBuffer --- app/proxyman/mux/mux_test.go | 2 +- app/proxyman/mux/reader.go | 2 +- app/proxyman/mux/writer.go | 2 +- common/buf/multi_buffer.go | 12 ++++++------ common/buf/reader.go | 2 +- common/buf/writer.go | 2 +- common/crypto/auth.go | 2 +- common/crypto/auth_test.go | 8 ++++---- common/crypto/chunk.go | 4 +++- common/crypto/chunk_test.go | 2 +- proxy/vmess/inbound/inbound.go | 2 +- proxy/vmess/outbound/outbound.go | 2 +- transport/internet/kcp/receiving.go | 2 +- transport/ray/direct.go | 6 +++--- 14 files changed, 26 insertions(+), 24 deletions(-) diff --git a/app/proxyman/mux/mux_test.go b/app/proxyman/mux/mux_test.go index 70cebf69..eacdd7d2 100644 --- a/app/proxyman/mux/mux_test.go +++ b/app/proxyman/mux/mux_test.go @@ -14,7 +14,7 @@ import ( ) func readAll(reader buf.Reader) (buf.MultiBuffer, error) { - mb := buf.NewMultiBuffer() + var mb buf.MultiBuffer for { b, err := reader.Read() if err == io.EOF { diff --git a/app/proxyman/mux/reader.go b/app/proxyman/mux/reader.go index 298eec05..acdfe75b 100644 --- a/app/proxyman/mux/reader.go +++ b/app/proxyman/mux/reader.go @@ -94,7 +94,7 @@ func (r *StreamReader) Read() (buf.MultiBuffer, error) { r.leftOver = int(size) } - mb := buf.NewMultiBuffer() + mb := buf.NewMultiBufferCap(32) for r.leftOver > 0 { readLen := buf.Size if r.leftOver < readLen { diff --git a/app/proxyman/mux/writer.go b/app/proxyman/mux/writer.go index cee325e8..39a3158c 100644 --- a/app/proxyman/mux/writer.go +++ b/app/proxyman/mux/writer.go @@ -71,7 +71,7 @@ func (w *Writer) writeData(mb buf.MultiBuffer) error { return err } - mb2 := buf.NewMultiBuffer() + mb2 := buf.NewMultiBufferCap(len(mb) + 1) mb2.Append(frame) mb2.AppendMulti(mb) return w.writer.Write(mb2) diff --git a/common/buf/multi_buffer.go b/common/buf/multi_buffer.go index 5a684fa4..72446630 100644 --- a/common/buf/multi_buffer.go +++ b/common/buf/multi_buffer.go @@ -20,7 +20,7 @@ type MultiBufferReader interface { // ReadAllToMultiBuffer reads all content from the reader into a MultiBuffer, until EOF. func ReadAllToMultiBuffer(reader io.Reader) (MultiBuffer, error) { - mb := NewMultiBuffer() + mb := NewMultiBufferCap(128) for { b := New() @@ -55,9 +55,9 @@ func ReadAllToBytes(reader io.Reader) ([]byte, error) { // MultiBuffer is a list of Buffers. The order of Buffer matters. type MultiBuffer []*Buffer -// NewMultiBuffer creates a new MultiBuffer instance. -func NewMultiBuffer() MultiBuffer { - return MultiBuffer(make([]*Buffer, 0, 128)) +// NewMultiBufferCap creates a new MultiBuffer instance. +func NewMultiBufferCap(capacity int) MultiBuffer { + return MultiBuffer(make([]*Buffer, 0, capacity)) } // NewMultiBufferValue wraps a list of Buffers into MultiBuffer. @@ -149,7 +149,7 @@ func (mb *MultiBuffer) Release() { b.Release() (*mb)[i] = nil } - *mb = (*mb)[:0] + *mb = nil } // ToNetBuffers converts this MultiBuffer to net.Buffers. The return net.Buffers points to the same content of the MultiBuffer. @@ -163,7 +163,7 @@ func (mb MultiBuffer) ToNetBuffers() net.Buffers { // SliceBySize splits the begining of this MultiBuffer into another one, for at most size bytes. func (mb *MultiBuffer) SliceBySize(size int) MultiBuffer { - slice := NewMultiBuffer() + slice := NewMultiBufferCap(10) sliceSize := 0 endIndex := len(*mb) for i, b := range *mb { diff --git a/common/buf/reader.go b/common/buf/reader.go index 8715075a..6d52ea0a 100644 --- a/common/buf/reader.go +++ b/common/buf/reader.go @@ -41,7 +41,7 @@ func (r *BytesToBufferReader) Read() (MultiBuffer, error) { return nil, err } - mb := NewMultiBuffer() + mb := NewMultiBufferCap(nBytes/Size + 1) mb.Write(r.buffer[:nBytes]) return mb, nil } diff --git a/common/buf/writer.go b/common/buf/writer.go index 36fa0edc..32122a15 100644 --- a/common/buf/writer.go +++ b/common/buf/writer.go @@ -75,7 +75,7 @@ type bytesToBufferWriter struct { // Write implements io.Writer. func (w *bytesToBufferWriter) Write(payload []byte) (int, error) { - mb := NewMultiBuffer() + mb := NewMultiBufferCap(len(payload)/Size + 1) mb.Write(payload) if err := w.writer.Write(mb); err != nil { return 0, err diff --git a/common/crypto/auth.go b/common/crypto/auth.go index 4c619cdb..289e14f2 100644 --- a/common/crypto/auth.go +++ b/common/crypto/auth.go @@ -157,7 +157,7 @@ func (r *AuthenticationReader) Read() (buf.MultiBuffer, error) { return nil, err } - mb := buf.NewMultiBuffer() + var mb buf.MultiBuffer if r.transferType == protocol.TransferTypeStream { mb.Write(b) } else { diff --git a/common/crypto/auth_test.go b/common/crypto/auth_test.go index cd10b1b6..602fa34e 100644 --- a/common/crypto/auth_test.go +++ b/common/crypto/auth_test.go @@ -44,7 +44,7 @@ func TestAuthenticationReaderWriter(t *testing.T) { assert(writer.Write(buf.NewMultiBufferValue(payload)), IsNil) assert(cache.Len(), Equals, 83360) - assert(writer.Write(buf.NewMultiBuffer()), IsNil) + assert(writer.Write(buf.MultiBuffer{}), IsNil) assert(err, IsNil) reader := NewAuthenticationReader(&AEADAuthenticator{ @@ -55,7 +55,7 @@ func TestAuthenticationReaderWriter(t *testing.T) { AdditionalDataGenerator: &NoOpBytesGenerator{}, }, PlainChunkSizeParser{}, cache, protocol.TransferTypeStream) - mb := buf.NewMultiBuffer() + var mb buf.MultiBuffer for mb.Len() < len(rawPayload) { mb2, err := reader.Read() @@ -95,7 +95,7 @@ func TestAuthenticationReaderWriterPacket(t *testing.T) { AdditionalDataGenerator: &NoOpBytesGenerator{}, }, PlainChunkSizeParser{}, cache, protocol.TransferTypePacket) - payload := buf.NewMultiBuffer() + var payload buf.MultiBuffer pb1 := buf.New() pb1.Append([]byte("abcd")) payload.Append(pb1) @@ -106,7 +106,7 @@ func TestAuthenticationReaderWriterPacket(t *testing.T) { assert(writer.Write(payload), IsNil) assert(cache.Len(), GreaterThan, 0) - assert(writer.Write(buf.NewMultiBuffer()), IsNil) + assert(writer.Write(buf.MultiBuffer{}), IsNil) assert(err, IsNil) reader := NewAuthenticationReader(&AEADAuthenticator{ diff --git a/common/crypto/chunk.go b/common/crypto/chunk.go index f284ef19..af43e346 100644 --- a/common/crypto/chunk.go +++ b/common/crypto/chunk.go @@ -48,6 +48,7 @@ func NewChunkStreamReader(sizeDecoder ChunkSizeDecoder, reader io.Reader) *Chunk sizeDecoder: sizeDecoder, reader: buf.NewReader(reader), buffer: make([]byte, sizeDecoder.SizeBytes()), + leftOver: buf.NewMultiBufferCap(16), } } @@ -129,8 +130,9 @@ func NewChunkStreamWriter(sizeEncoder ChunkSizeEncoder, writer io.Writer) *Chunk } func (w *ChunkStreamWriter) Write(mb buf.MultiBuffer) error { - mb2Write := buf.NewMultiBuffer() const sliceSize = 8192 + mbLen := mb.Len() + mb2Write := buf.NewMultiBufferCap(mbLen / buf.Size + mbLen / sliceSize + 2) for { slice := mb.SliceBySize(sliceSize) diff --git a/common/crypto/chunk_test.go b/common/crypto/chunk_test.go index 67144dce..2c9763cb 100644 --- a/common/crypto/chunk_test.go +++ b/common/crypto/chunk_test.go @@ -25,7 +25,7 @@ func TestChunkStreamIO(t *testing.T) { b.AppendBytes('e', 'f', 'g') assert(writer.Write(buf.NewMultiBufferValue(b)), IsNil) - assert(writer.Write(buf.NewMultiBuffer()), IsNil) + assert(writer.Write(buf.MultiBuffer{}), IsNil) assert(cache.Len(), Equals, 13) diff --git a/proxy/vmess/inbound/inbound.go b/proxy/vmess/inbound/inbound.go index 877e51ea..faff1340 100644 --- a/proxy/vmess/inbound/inbound.go +++ b/proxy/vmess/inbound/inbound.go @@ -163,7 +163,7 @@ func transferResponse(timer signal.ActivityUpdater, session *encoding.ServerSess } if request.Option.Has(protocol.RequestOptionChunkStream) { - if err := bodyWriter.Write(buf.NewMultiBuffer()); err != nil { + if err := bodyWriter.Write(buf.MultiBuffer{}); err != nil { return err } } diff --git a/proxy/vmess/outbound/outbound.go b/proxy/vmess/outbound/outbound.go index 3e395254..a883d1fb 100644 --- a/proxy/vmess/outbound/outbound.go +++ b/proxy/vmess/outbound/outbound.go @@ -132,7 +132,7 @@ func (v *Handler) Process(ctx context.Context, outboundRay ray.OutboundRay, dial } if request.Option.Has(protocol.RequestOptionChunkStream) { - if err := bodyWriter.Write(buf.NewMultiBuffer()); err != nil { + if err := bodyWriter.Write(buf.MultiBuffer{}); err != nil { return err } } diff --git a/transport/internet/kcp/receiving.go b/transport/internet/kcp/receiving.go index 5024628b..8c281bb9 100644 --- a/transport/internet/kcp/receiving.go +++ b/transport/internet/kcp/receiving.go @@ -203,7 +203,7 @@ func (v *ReceivingWorker) ReadMultiBuffer() buf.MultiBuffer { return mb } - mb := buf.NewMultiBuffer() + mb := buf.NewMultiBufferCap(32) v.Lock() defer v.Unlock() diff --git a/transport/ray/direct.go b/transport/ray/direct.go index 34a01fc8..2378e394 100644 --- a/transport/ray/direct.go +++ b/transport/ray/direct.go @@ -197,10 +197,10 @@ func (s *Stream) Write(data buf.MultiBuffer) error { } if s.data == nil { - s.data = data - } else { - s.data.AppendMulti(data) + s.data = buf.NewMultiBufferCap(128) } + + s.data.AppendMulti(data) s.size += uint64(data.Len()) s.notifyWrite() From 6e61538b36f2d89f1ca7afbb8a7ac8f58b56431d Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Thu, 9 Nov 2017 01:06:40 +0100 Subject: [PATCH 118/229] close http server properly --- testing/servers/http/http.go | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/testing/servers/http/http.go b/testing/servers/http/http.go index 47ecca11..230e973c 100644 --- a/testing/servers/http/http.go +++ b/testing/servers/http/http.go @@ -10,9 +10,10 @@ type Server struct { Port net.Port PathHandler map[string]http.HandlerFunc accepting bool + server *http.Server } -func (server *Server) ServeHTTP(resp http.ResponseWriter, req *http.Request) { +func (s *Server) ServeHTTP(resp http.ResponseWriter, req *http.Request) { if req.URL.Path == "/" { resp.Header().Set("Content-Type", "text/plain; charset=utf-8") resp.WriteHeader(http.StatusOK) @@ -20,17 +21,21 @@ func (server *Server) ServeHTTP(resp http.ResponseWriter, req *http.Request) { return } - handler, found := server.PathHandler[req.URL.Path] + handler, found := s.PathHandler[req.URL.Path] if found { handler(resp, req) } } -func (server *Server) Start() (net.Destination, error) { - go http.ListenAndServe("127.0.0.1:"+server.Port.String(), server) - return net.TCPDestination(net.LocalHostIP, net.Port(server.Port)), nil +func (s *Server) Start() (net.Destination, error) { + s.server = &http.Server{ + Addr: "127.0.0.1:" + s.Port.String(), + Handler: s, + } + go s.server.ListenAndServe() + return net.TCPDestination(net.LocalHostIP, net.Port(s.Port)), nil } -func (v *Server) Close() { - v.accepting = false +func (s *Server) Close() { + s.server.Close() } From 594ec15c0978e046e9697e6a280ff464313e41cf Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Thu, 9 Nov 2017 22:33:15 +0100 Subject: [PATCH 119/229] cleanup buffer usage --- app/proxyman/mux/mux.go | 6 +- app/proxyman/mux/mux_test.go | 6 +- app/proxyman/mux/reader.go | 8 +- app/proxyman/mux/writer.go | 10 +- app/proxyman/outbound/handler.go | 27 ++-- common/buf/buffered_reader.go | 53 ------- common/buf/buffered_reader_test.go | 36 ----- common/buf/buffered_writer.go | 73 --------- common/buf/buffered_writer_test.go | 54 ------- common/buf/copy.go | 16 +- common/buf/io.go | 55 ++----- common/buf/multi_buffer.go | 10 -- common/buf/reader.go | 61 +++++--- common/buf/reader_test.go | 19 +-- common/buf/writer.go | 171 ++++++++++++++------- common/buf/writer_test.go | 17 +- common/crypto/auth.go | 70 +++++---- common/crypto/auth_test.go | 16 +- common/crypto/chunk.go | 12 +- common/crypto/chunk_test.go | 12 +- common/crypto/io.go | 2 +- proxy/blackhole/config.go | 2 +- proxy/http/server.go | 7 +- proxy/shadowsocks/client.go | 2 +- proxy/shadowsocks/ota.go | 6 +- proxy/shadowsocks/ota_test.go | 4 +- proxy/shadowsocks/protocol.go | 2 +- proxy/shadowsocks/protocol_test.go | 12 +- proxy/shadowsocks/server.go | 10 +- proxy/socks/protocol.go | 2 +- proxy/socks/protocol_test.go | 4 +- proxy/socks/server.go | 4 +- proxy/vmess/inbound/inbound.go | 12 +- proxy/vmess/outbound/outbound.go | 8 +- transport/internet/kcp/connection.go | 12 +- transport/internet/tls/tls.go | 20 +-- transport/internet/udp/dispatcher.go | 4 +- transport/internet/udp/dispatcher_test.go | 4 +- transport/internet/websocket/connection.go | 20 +-- transport/ray/direct.go | 4 +- transport/ray/direct_test.go | 14 +- 41 files changed, 358 insertions(+), 529 deletions(-) delete mode 100644 common/buf/buffered_reader.go delete mode 100644 common/buf/buffered_reader_test.go delete mode 100644 common/buf/buffered_writer.go delete mode 100644 common/buf/buffered_writer_test.go diff --git a/app/proxyman/mux/mux.go b/app/proxyman/mux/mux.go index 17007b24..5470a293 100644 --- a/app/proxyman/mux/mux.go +++ b/app/proxyman/mux/mux.go @@ -161,7 +161,7 @@ func fetchInput(ctx context.Context, s *Session, output buf.Writer) { log.Trace(newError("dispatching request to ", dest)) data, _ := s.input.ReadTimeout(time.Millisecond * 500) - if err := writer.Write(data); err != nil { + if err := writer.WriteMultiBuffer(data); err != nil { log.Trace(newError("failed to write first payload").Base(err)) return } @@ -234,7 +234,7 @@ func (m *Client) handleStatusEnd(meta *FrameMetadata, reader io.Reader) error { func (m *Client) fetchOutput() { defer m.cancel() - reader := buf.ToBytesReader(m.inboundRay.InboundOutput()) + reader := buf.NewBufferedReader(m.inboundRay.InboundOutput()) for { meta, err := ReadMetadata(reader) @@ -396,7 +396,7 @@ func (w *ServerWorker) handleFrame(ctx context.Context, reader io.Reader) error func (w *ServerWorker) run(ctx context.Context) { input := w.outboundRay.OutboundInput() - reader := buf.ToBytesReader(input) + reader := buf.NewBufferedReader(input) defer w.sessionManager.Close() diff --git a/app/proxyman/mux/mux_test.go b/app/proxyman/mux/mux_test.go index eacdd7d2..bb6425c6 100644 --- a/app/proxyman/mux/mux_test.go +++ b/app/proxyman/mux/mux_test.go @@ -16,7 +16,7 @@ import ( func readAll(reader buf.Reader) (buf.MultiBuffer, error) { var mb buf.MultiBuffer for { - b, err := reader.Read() + b, err := reader.ReadMultiBuffer() if err == io.EOF { break } @@ -45,7 +45,7 @@ func TestReaderWriter(t *testing.T) { writePayload := func(writer *Writer, payload ...byte) error { b := buf.New() b.Append(payload) - return writer.Write(buf.NewMultiBufferValue(b)) + return writer.WriteMultiBuffer(buf.NewMultiBufferValue(b)) } assert(writePayload(writer, 'a', 'b', 'c', 'd'), IsNil) @@ -60,7 +60,7 @@ func TestReaderWriter(t *testing.T) { assert(writePayload(writer2, 'y'), IsNil) writer2.Close() - bytesReader := buf.ToBytesReader(stream) + bytesReader := buf.NewBufferedReader(stream) streamReader := NewStreamReader(bytesReader) meta, err := ReadMetadata(bytesReader) diff --git a/app/proxyman/mux/reader.go b/app/proxyman/mux/reader.go index acdfe75b..80192dc9 100644 --- a/app/proxyman/mux/reader.go +++ b/app/proxyman/mux/reader.go @@ -40,8 +40,8 @@ func NewPacketReader(reader io.Reader) *PacketReader { } } -// Read implements buf.Reader. -func (r *PacketReader) Read() (buf.MultiBuffer, error) { +// ReadMultiBuffer implements buf.Reader. +func (r *PacketReader) ReadMultiBuffer() (buf.MultiBuffer, error) { if r.eof { return nil, io.EOF } @@ -79,8 +79,8 @@ func NewStreamReader(reader io.Reader) *StreamReader { } } -// Read implmenets buf.Reader. -func (r *StreamReader) Read() (buf.MultiBuffer, error) { +// ReadMultiBuffer implmenets buf.Reader. +func (r *StreamReader) ReadMultiBuffer() (buf.MultiBuffer, error) { if r.leftOver == 0 { r.leftOver = -1 return nil, io.EOF diff --git a/app/proxyman/mux/writer.go b/app/proxyman/mux/writer.go index 39a3158c..64c290bd 100644 --- a/app/proxyman/mux/writer.go +++ b/app/proxyman/mux/writer.go @@ -56,7 +56,7 @@ func (w *Writer) writeMetaOnly() error { if err := b.Reset(meta.AsSupplier()); err != nil { return err } - return w.writer.Write(buf.NewMultiBufferValue(b)) + return w.writer.WriteMultiBuffer(buf.NewMultiBufferValue(b)) } func (w *Writer) writeData(mb buf.MultiBuffer) error { @@ -74,11 +74,11 @@ func (w *Writer) writeData(mb buf.MultiBuffer) error { mb2 := buf.NewMultiBufferCap(len(mb) + 1) mb2.Append(frame) mb2.AppendMulti(mb) - return w.writer.Write(mb2) + return w.writer.WriteMultiBuffer(mb2) } -// Write implements buf.MultiBufferWriter. -func (w *Writer) Write(mb buf.MultiBuffer) error { +// WriteMultiBuffer implements buf.Writer. +func (w *Writer) WriteMultiBuffer(mb buf.MultiBuffer) error { defer mb.Release() if mb.IsEmpty() { @@ -109,5 +109,5 @@ func (w *Writer) Close() { frame := buf.New() common.Must(frame.Reset(meta.AsSupplier())) - w.writer.Write(buf.NewMultiBufferValue(frame)) + w.writer.WriteMultiBuffer(buf.NewMultiBufferValue(frame)) } diff --git a/app/proxyman/outbound/handler.go b/app/proxyman/outbound/handler.go index 8c6d4bbd..03027bdb 100644 --- a/app/proxyman/outbound/handler.go +++ b/app/proxyman/outbound/handler.go @@ -123,8 +123,8 @@ func (h *Handler) Dial(ctx context.Context, dest net.Destination) (internet.Conn } var ( - _ buf.MultiBufferReader = (*Connection)(nil) - _ buf.MultiBufferWriter = (*Connection)(nil) + _ buf.Reader = (*Connection)(nil) + _ buf.Writer = (*Connection)(nil) ) type Connection struct { @@ -133,9 +133,8 @@ type Connection struct { localAddr net.Addr remoteAddr net.Addr - bytesReader io.Reader - reader buf.Reader - writer buf.Writer + reader *buf.BufferedReader + writer buf.Writer } func NewConnection(stream ray.Ray) *Connection { @@ -149,9 +148,8 @@ func NewConnection(stream ray.Ray) *Connection { IP: []byte{0, 0, 0, 0}, Port: 0, }, - bytesReader: buf.ToBytesReader(stream.InboundOutput()), - reader: stream.InboundOutput(), - writer: stream.InboundInput(), + reader: buf.NewBufferedReader(stream.InboundOutput()), + writer: stream.InboundInput(), } } @@ -160,11 +158,11 @@ func (v *Connection) Read(b []byte) (int, error) { if v.closed { return 0, io.EOF } - return v.bytesReader.Read(b) + return v.reader.Read(b) } func (v *Connection) ReadMultiBuffer() (buf.MultiBuffer, error) { - return v.reader.Read() + return v.reader.ReadMultiBuffer() } // Write implements net.Conn.Write(). @@ -172,14 +170,19 @@ func (v *Connection) Write(b []byte) (int, error) { if v.closed { return 0, io.ErrClosedPipe } - return buf.ToBytesWriter(v.writer).Write(b) + + l := len(b) + mb := buf.NewMultiBufferCap(l/buf.Size + 1) + mb.Write(b) + return l, v.writer.WriteMultiBuffer(mb) } func (v *Connection) WriteMultiBuffer(mb buf.MultiBuffer) error { if v.closed { return io.ErrClosedPipe } - return v.writer.Write(mb) + + return v.writer.WriteMultiBuffer(mb) } // Close implements net.Conn.Close(). diff --git a/common/buf/buffered_reader.go b/common/buf/buffered_reader.go deleted file mode 100644 index 66ef5c06..00000000 --- a/common/buf/buffered_reader.go +++ /dev/null @@ -1,53 +0,0 @@ -package buf - -import ( - "io" -) - -// BufferedReader is a reader with internal cache. -type BufferedReader struct { - reader io.Reader - buffer *Buffer - buffered bool -} - -// NewBufferedReader creates a new BufferedReader based on an io.Reader. -func NewBufferedReader(rawReader io.Reader) *BufferedReader { - return &BufferedReader{ - reader: rawReader, - buffer: NewLocal(1024), - buffered: true, - } -} - -// IsBuffered returns true if the internal cache is effective. -func (r *BufferedReader) IsBuffered() bool { - return r.buffered -} - -// SetBuffered is to enable or disable internal cache. If cache is disabled, -// Read() calls will be delegated to the underlying io.Reader directly. -func (r *BufferedReader) SetBuffered(cached bool) { - r.buffered = cached -} - -// Read implements io.Reader.Read(). -func (r *BufferedReader) Read(b []byte) (int, error) { - if !r.buffered || r.buffer == nil { - if !r.buffer.IsEmpty() { - return r.buffer.Read(b) - } - return r.reader.Read(b) - } - if r.buffer.IsEmpty() { - if err := r.buffer.Reset(ReadFrom(r.reader)); err != nil { - return 0, err - } - } - - if r.buffer.IsEmpty() { - return 0, nil - } - - return r.buffer.Read(b) -} diff --git a/common/buf/buffered_reader_test.go b/common/buf/buffered_reader_test.go deleted file mode 100644 index d646ee03..00000000 --- a/common/buf/buffered_reader_test.go +++ /dev/null @@ -1,36 +0,0 @@ -package buf_test - -import ( - "crypto/rand" - "testing" - - . "v2ray.com/core/common/buf" - . "v2ray.com/ext/assert" -) - -func TestBufferedReader(t *testing.T) { - assert := With(t) - - content := New() - assert(content.AppendSupplier(ReadFrom(rand.Reader)), IsNil) - - len := content.Len() - - reader := NewBufferedReader(content) - assert(reader.IsBuffered(), IsTrue) - - payload := make([]byte, 16) - - nBytes, err := reader.Read(payload) - assert(nBytes, Equals, 16) - assert(err, IsNil) - - len2 := content.Len() - assert(len-len2, GreaterThan, 16) - - nBytes, err = reader.Read(payload) - assert(nBytes, Equals, 16) - assert(err, IsNil) - - assert(content.Len(), Equals, len2) -} diff --git a/common/buf/buffered_writer.go b/common/buf/buffered_writer.go deleted file mode 100644 index b3ff77a3..00000000 --- a/common/buf/buffered_writer.go +++ /dev/null @@ -1,73 +0,0 @@ -package buf - -import "io" - -// BufferedWriter is an io.Writer with internal buffer. It writes to underlying writer when buffer is full or on demand. -// This type is not thread safe. -type BufferedWriter struct { - writer io.Writer - buffer *Buffer - buffered bool -} - -// NewBufferedWriter creates a new BufferedWriter. -func NewBufferedWriter(writer io.Writer) *BufferedWriter { - return NewBufferedWriterSize(writer, 1024) -} - -// NewBufferedWriterSize creates a BufferedWriter with specified buffer size. -func NewBufferedWriterSize(writer io.Writer, size uint32) *BufferedWriter { - return &BufferedWriter{ - writer: writer, - buffer: NewLocal(int(size)), - buffered: true, - } -} - -// Write implements io.Writer. -func (w *BufferedWriter) Write(b []byte) (int, error) { - if !w.buffered || w.buffer == nil { - return w.writer.Write(b) - } - bytesWritten := 0 - for bytesWritten < len(b) { - nBytes, err := w.buffer.Write(b[bytesWritten:]) - if err != nil { - return bytesWritten, err - } - bytesWritten += nBytes - if w.buffer.IsFull() { - if err := w.Flush(); err != nil { - return bytesWritten, err - } - } - } - return bytesWritten, nil -} - -// Flush writes all buffered content into underlying writer, if any. -func (w *BufferedWriter) Flush() error { - defer w.buffer.Clear() - for !w.buffer.IsEmpty() { - nBytes, err := w.writer.Write(w.buffer.Bytes()) - if err != nil { - return err - } - w.buffer.SliceFrom(nBytes) - } - return nil -} - -// IsBuffered returns true if this BufferedWriter holds a buffer. -func (w *BufferedWriter) IsBuffered() bool { - return w.buffered -} - -// SetBuffered controls whether the BufferedWriter holds a buffer for writing. If not buffered, any write() calls into underlying writer directly. -func (w *BufferedWriter) SetBuffered(cached bool) error { - w.buffered = cached - if !cached && !w.buffer.IsEmpty() { - return w.Flush() - } - return nil -} diff --git a/common/buf/buffered_writer_test.go b/common/buf/buffered_writer_test.go deleted file mode 100644 index 9368633e..00000000 --- a/common/buf/buffered_writer_test.go +++ /dev/null @@ -1,54 +0,0 @@ -package buf_test - -import ( - "crypto/rand" - "testing" - - "v2ray.com/core/common" - . "v2ray.com/core/common/buf" - . "v2ray.com/ext/assert" -) - -func TestBufferedWriter(t *testing.T) { - assert := With(t) - - content := New() - - writer := NewBufferedWriter(content) - assert(writer.IsBuffered(), IsTrue) - - payload := make([]byte, 16) - - nBytes, err := writer.Write(payload) - assert(nBytes, Equals, 16) - assert(err, IsNil) - - assert(content.IsEmpty(), IsTrue) - - assert(writer.SetBuffered(false), IsNil) - assert(content.Len(), Equals, 16) -} - -func TestBufferedWriterLargePayload(t *testing.T) { - assert := With(t) - - content := NewLocal(128 * 1024) - - writer := NewBufferedWriter(content) - assert(writer.IsBuffered(), IsTrue) - - payload := make([]byte, 64*1024) - common.Must2(rand.Read(payload)) - - nBytes, err := writer.Write(payload[:512]) - assert(nBytes, Equals, 512) - assert(err, IsNil) - - assert(content.IsEmpty(), IsTrue) - - nBytes, err = writer.Write(payload[512:]) - assert(err, IsNil) - assert(writer.Flush(), IsNil) - assert(nBytes, Equals, 64*1024-512) - assert(content.Bytes(), Equals, payload) -} diff --git a/common/buf/copy.go b/common/buf/copy.go index 873e187a..f8d4577e 100644 --- a/common/buf/copy.go +++ b/common/buf/copy.go @@ -17,7 +17,7 @@ type copyHandler struct { } func (h *copyHandler) readFrom(reader Reader) (MultiBuffer, error) { - mb, err := reader.Read() + mb, err := reader.ReadMultiBuffer() if err != nil { for _, handler := range h.onReadError { err = handler(err) @@ -27,7 +27,7 @@ func (h *copyHandler) readFrom(reader Reader) (MultiBuffer, error) { } func (h *copyHandler) writeTo(writer Writer, mb MultiBuffer) error { - err := writer.Write(mb) + err := writer.WriteMultiBuffer(mb) if err != nil { for _, handler := range h.onWriteError { err = handler(err) @@ -36,6 +36,10 @@ func (h *copyHandler) writeTo(writer Writer, mb MultiBuffer) error { return err } +type SizeCounter struct { + Size int64 +} + type CopyOption func(*copyHandler) func IgnoreReaderError() CopyOption { @@ -62,6 +66,14 @@ func UpdateActivity(timer signal.ActivityUpdater) CopyOption { } } +func CountSize(sc *SizeCounter) CopyOption { + return func(handler *copyHandler) { + handler.onData = append(handler.onData, func(b MultiBuffer) { + sc.Size += int64(b.Len()) + }) + } +} + func copyInternal(reader Reader, writer Writer, handler *copyHandler) error { for { buffer, err := handler.readFrom(reader) diff --git a/common/buf/io.go b/common/buf/io.go index a7abeff1..17debb2b 100644 --- a/common/buf/io.go +++ b/common/buf/io.go @@ -5,10 +5,10 @@ import ( "time" ) -// Reader extends io.Reader with alloc.Buffer. +// Reader extends io.Reader with MultiBuffer. type Reader interface { - // Read reads content from underlying reader, and put it into an alloc.Buffer. - Read() (MultiBuffer, error) + // ReadMultiBuffer reads content from underlying reader, and put it into a MultiBuffer. + ReadMultiBuffer() (MultiBuffer, error) } // ErrReadTimeout is an error that happens with IO timeout. @@ -19,10 +19,10 @@ type TimeoutReader interface { ReadTimeout(time.Duration) (MultiBuffer, error) } -// Writer extends io.Writer with alloc.Buffer. +// Writer extends io.Writer with MultiBuffer. type Writer interface { - // Write writes an alloc.Buffer into underlying writer. - Write(MultiBuffer) error + // WriteMultiBuffer writes a MultiBuffer into underlying writer. + WriteMultiBuffer(MultiBuffer) error } // ReadFrom creates a Supplier to read from a given io.Reader. @@ -49,45 +49,21 @@ func ReadAtLeastFrom(reader io.Reader, size int) Supplier { // NewReader creates a new Reader. // The Reader instance doesn't take the ownership of reader. func NewReader(reader io.Reader) Reader { - if mr, ok := reader.(MultiBufferReader); ok { - return &readerAdpater{ - MultiBufferReader: mr, - } + if mr, ok := reader.(Reader); ok { + return mr } - return &BytesToBufferReader{ - reader: reader, - } -} - -// ToBytesReader converts a Reaaer to io.Reader. -func ToBytesReader(stream Reader) io.Reader { - return &bufferToBytesReader{ - stream: stream, - } + return NewBytesToBufferReader(reader) } // NewWriter creates a new Writer. func NewWriter(writer io.Writer) Writer { - if mw, ok := writer.(MultiBufferWriter); ok { - return &writerAdapter{ - writer: mw, - } + if mw, ok := writer.(Writer); ok { + return mw } return &BufferToBytesWriter{ - writer: writer, - } -} - -func NewMergingWriter(writer io.Writer) Writer { - return NewMergingWriterSize(writer, 4096) -} - -func NewMergingWriterSize(writer io.Writer, size uint32) Writer { - return &mergingWriter{ - writer: writer, - buffer: make([]byte, size), + Writer: writer, } } @@ -96,10 +72,3 @@ func NewSequentialWriter(writer io.Writer) Writer { writer: writer, } } - -// ToBytesWriter converts a Writer to io.Writer -func ToBytesWriter(writer Writer) io.Writer { - return &bytesToBufferWriter{ - writer: writer, - } -} diff --git a/common/buf/multi_buffer.go b/common/buf/multi_buffer.go index 72446630..b2814e5f 100644 --- a/common/buf/multi_buffer.go +++ b/common/buf/multi_buffer.go @@ -8,16 +8,6 @@ import ( "v2ray.com/core/common/errors" ) -// MultiBufferWriter is a writer that writes MultiBuffer. -type MultiBufferWriter interface { - WriteMultiBuffer(MultiBuffer) error -} - -// MultiBufferReader is a reader that reader payload as MultiBuffer. -type MultiBufferReader interface { - ReadMultiBuffer() (MultiBuffer, error) -} - // ReadAllToMultiBuffer reads all content from the reader into a MultiBuffer, until EOF. func ReadAllToMultiBuffer(reader io.Reader) (MultiBuffer, error) { mb := NewMultiBufferCap(128) diff --git a/common/buf/reader.go b/common/buf/reader.go index 6d52ea0a..8a327b3e 100644 --- a/common/buf/reader.go +++ b/common/buf/reader.go @@ -8,19 +8,19 @@ import ( // BytesToBufferReader is a Reader that adjusts its reading speed automatically. type BytesToBufferReader struct { - reader io.Reader + io.Reader buffer []byte } func NewBytesToBufferReader(reader io.Reader) Reader { return &BytesToBufferReader{ - reader: reader, + Reader: reader, } } func (r *BytesToBufferReader) readSmall() (MultiBuffer, error) { b := New() - if err := b.Reset(ReadFrom(r.reader)); err != nil { + if err := b.Reset(ReadFrom(r.Reader)); err != nil { b.Release() return nil, err } @@ -30,13 +30,13 @@ func (r *BytesToBufferReader) readSmall() (MultiBuffer, error) { return NewMultiBufferValue(b), nil } -// Read implements Reader.Read(). -func (r *BytesToBufferReader) Read() (MultiBuffer, error) { +// ReadMultiBuffer implements Reader. +func (r *BytesToBufferReader) ReadMultiBuffer() (MultiBuffer, error) { if r.buffer == nil { return r.readSmall() } - nBytes, err := r.reader.Read(r.buffer) + nBytes, err := r.Reader.Read(r.buffer) if err != nil { return nil, err } @@ -46,20 +46,33 @@ func (r *BytesToBufferReader) Read() (MultiBuffer, error) { return mb, nil } -type readerAdpater struct { - MultiBufferReader +type BufferedReader struct { + stream Reader + legacyReader io.Reader + leftOver MultiBuffer + buffered bool } -func (r *readerAdpater) Read() (MultiBuffer, error) { - return r.ReadMultiBuffer() +func NewBufferedReader(reader Reader) *BufferedReader { + r := &BufferedReader{ + stream: reader, + buffered: true, + } + if lr, ok := reader.(io.Reader); ok { + r.legacyReader = lr + } + return r } -type bufferToBytesReader struct { - stream Reader - leftOver MultiBuffer +func (r *BufferedReader) SetBuffered(f bool) { + r.buffered = f } -func (r *bufferToBytesReader) Read(b []byte) (int, error) { +func (r *BufferedReader) IsBuffered() bool { + return r.buffered +} + +func (r *BufferedReader) Read(b []byte) (int, error) { if r.leftOver != nil { nBytes, _ := r.leftOver.Read(b) if r.leftOver.IsEmpty() { @@ -69,7 +82,11 @@ func (r *bufferToBytesReader) Read(b []byte) (int, error) { return nBytes, nil } - mb, err := r.stream.Read() + if !r.buffered && r.legacyReader != nil { + return r.legacyReader.Read(b) + } + + mb, err := r.stream.ReadMultiBuffer() if err != nil { return 0, err } @@ -81,39 +98,39 @@ func (r *bufferToBytesReader) Read(b []byte) (int, error) { return nBytes, nil } -func (r *bufferToBytesReader) ReadMultiBuffer() (MultiBuffer, error) { +func (r *BufferedReader) ReadMultiBuffer() (MultiBuffer, error) { if r.leftOver != nil { mb := r.leftOver r.leftOver = nil return mb, nil } - return r.stream.Read() + return r.stream.ReadMultiBuffer() } -func (r *bufferToBytesReader) writeToInternal(writer io.Writer) (int64, error) { +func (r *BufferedReader) writeToInternal(writer io.Writer) (int64, error) { mbWriter := NewWriter(writer) totalBytes := int64(0) if r.leftOver != nil { totalBytes += int64(r.leftOver.Len()) - if err := mbWriter.Write(r.leftOver); err != nil { + if err := mbWriter.WriteMultiBuffer(r.leftOver); err != nil { return 0, err } } for { - mb, err := r.stream.Read() + mb, err := r.stream.ReadMultiBuffer() if err != nil { return totalBytes, err } totalBytes += int64(mb.Len()) - if err := mbWriter.Write(mb); err != nil { + if err := mbWriter.WriteMultiBuffer(mb); err != nil { return totalBytes, err } } } -func (r *bufferToBytesReader) WriteTo(writer io.Writer) (int64, error) { +func (r *BufferedReader) WriteTo(writer io.Writer) (int64, error) { nBytes, err := r.writeToInternal(writer) if errors.Cause(err) == io.EOF { return nBytes, nil diff --git a/common/buf/reader_test.go b/common/buf/reader_test.go index f33ed4ce..35c14432 100644 --- a/common/buf/reader_test.go +++ b/common/buf/reader_test.go @@ -15,11 +15,11 @@ func TestAdaptiveReader(t *testing.T) { assert := With(t) reader := NewReader(bytes.NewReader(make([]byte, 1024*1024))) - b, err := reader.Read() + b, err := reader.ReadMultiBuffer() assert(err, IsNil) assert(b.Len(), Equals, 2*1024) - b, err = reader.Read() + b, err = reader.ReadMultiBuffer() assert(err, IsNil) assert(b.Len(), Equals, 32*1024) } @@ -28,22 +28,23 @@ func TestBytesReaderWriteTo(t *testing.T) { assert := With(t) stream := ray.NewStream(context.Background()) - reader := ToBytesReader(stream) + reader := NewBufferedReader(stream) b1 := New() b1.AppendBytes('a', 'b', 'c') b2 := New() b2.AppendBytes('e', 'f', 'g') - assert(stream.Write(NewMultiBufferValue(b1, b2)), IsNil) + assert(stream.WriteMultiBuffer(NewMultiBufferValue(b1, b2)), IsNil) stream.Close() stream2 := ray.NewStream(context.Background()) - writer := ToBytesWriter(stream2) + writer := NewBufferedWriter(stream2) + writer.SetBuffered(false) nBytes, err := io.Copy(writer, reader) assert(err, IsNil) assert(nBytes, Equals, int64(6)) - mb, err := stream2.Read() + mb, err := stream2.ReadMultiBuffer() assert(err, IsNil) assert(len(mb), Equals, 2) assert(mb[0].String(), Equals, "abc") @@ -54,16 +55,16 @@ func TestBytesReaderMultiBuffer(t *testing.T) { assert := With(t) stream := ray.NewStream(context.Background()) - reader := ToBytesReader(stream) + reader := NewBufferedReader(stream) b1 := New() b1.AppendBytes('a', 'b', 'c') b2 := New() b2.AppendBytes('e', 'f', 'g') - assert(stream.Write(NewMultiBufferValue(b1, b2)), IsNil) + assert(stream.WriteMultiBuffer(NewMultiBufferValue(b1, b2)), IsNil) stream.Close() mbReader := NewReader(reader) - mb, err := mbReader.Read() + mb, err := mbReader.ReadMultiBuffer() assert(err, IsNil) assert(len(mb), Equals, 2) assert(mb[0].String(), Equals, "abc") diff --git a/common/buf/writer.go b/common/buf/writer.go index 32122a15..4825db6f 100644 --- a/common/buf/writer.go +++ b/common/buf/writer.go @@ -8,49 +8,142 @@ import ( // BufferToBytesWriter is a Writer that writes alloc.Buffer into underlying writer. type BufferToBytesWriter struct { - writer io.Writer + io.Writer } -// Write implements Writer.Write(). Write() takes ownership of the given buffer. -func (w *BufferToBytesWriter) Write(mb MultiBuffer) error { +func NewBufferToBytesWriter(writer io.Writer) *BufferToBytesWriter { + return &BufferToBytesWriter{ + Writer: writer, + } +} + +// WriteMultiBuffer implements Writer. This method takes ownership of the given buffer. +func (w *BufferToBytesWriter) WriteMultiBuffer(mb MultiBuffer) error { defer mb.Release() bs := mb.ToNetBuffers() - _, err := bs.WriteTo(w.writer) + _, err := bs.WriteTo(w) return err } -type writerAdapter struct { - writer MultiBufferWriter +func (w *BufferToBytesWriter) ReadFrom(reader io.Reader) (int64, error) { + if readerFrom, ok := w.Writer.(io.ReaderFrom); ok { + return readerFrom.ReadFrom(reader) + } + + var sc SizeCounter + err := Copy(NewReader(reader), w, CountSize(&sc)) + return sc.Size, err } -// Write implements buf.MultiBufferWriter. -func (w *writerAdapter) Write(mb MultiBuffer) error { - return w.writer.WriteMultiBuffer(mb) +type BufferedWriter struct { + writer Writer + legacyWriter io.Writer + buffer *Buffer + buffered bool } -type mergingWriter struct { - writer io.Writer - buffer []byte +func NewBufferedWriter(writer Writer) *BufferedWriter { + w := &BufferedWriter{ + writer: writer, + buffer: New(), + buffered: true, + } + if lw, ok := writer.(io.Writer); ok { + w.legacyWriter = lw + } + return w } -func (w *mergingWriter) Write(mb MultiBuffer) error { - defer mb.Release() +func (w *BufferedWriter) Write(b []byte) (int, error) { + if !w.buffered && w.legacyWriter != nil { + return w.legacyWriter.Write(b) + } - for !mb.IsEmpty() { - nBytes, _ := mb.Read(w.buffer) - if _, err := w.writer.Write(w.buffer[:nBytes]); err != nil { + totalBytes := 0 + for len(b) > 0 { + nBytes, err := w.buffer.Write(b) + totalBytes += nBytes + if err != nil { + return totalBytes, err + } + if w.buffer.IsFull() { + if err := w.Flush(); err != nil { + return totalBytes, err + } + } + b = b[nBytes:] + } + return totalBytes, nil +} + +func (w *BufferedWriter) WriteMultiBuffer(b MultiBuffer) error { + if !w.buffered { + return w.writer.WriteMultiBuffer(b) + } + + defer b.Release() + + for !b.IsEmpty() { + if err := w.buffer.AppendSupplier(ReadFrom(&b)); err != nil { return err } + if w.buffer.IsFull() { + if err := w.Flush(); err != nil { + return err + } + } + } + + return nil +} + +func (w *BufferedWriter) Flush() error { + if !w.buffer.IsEmpty() { + if err := w.writer.WriteMultiBuffer(NewMultiBufferValue(w.buffer)); err != nil { + return err + } + + if w.buffered { + w.buffer = New() + } else { + w.buffer = nil + } } return nil } +func (w *BufferedWriter) SetBuffered(f bool) error { + w.buffered = f + if !f { + return w.Flush() + } + return nil +} + +func (w *BufferedWriter) ReadFrom(reader io.Reader) (int64, error) { + var sc SizeCounter + if !w.buffer.IsEmpty() { + sc.Size += int64(w.buffer.Len()) + if err := w.Flush(); err != nil { + return sc.Size, err + } + } + + if readerFrom, ok := w.writer.(io.ReaderFrom); ok { + return readerFrom.ReadFrom(reader) + } + + w.buffered = false + err := Copy(NewReader(reader), w, CountSize(&sc)) + return sc.Size, err +} + type seqWriter struct { writer io.Writer } -func (w *seqWriter) Write(mb MultiBuffer) error { +func (w *seqWriter) WriteMultiBuffer(mb MultiBuffer) error { defer mb.Release() for _, b := range mb { @@ -65,49 +158,9 @@ func (w *seqWriter) Write(mb MultiBuffer) error { return nil } -var ( - _ MultiBufferWriter = (*bytesToBufferWriter)(nil) -) - -type bytesToBufferWriter struct { - writer Writer -} - -// Write implements io.Writer. -func (w *bytesToBufferWriter) Write(payload []byte) (int, error) { - mb := NewMultiBufferCap(len(payload)/Size + 1) - mb.Write(payload) - if err := w.writer.Write(mb); err != nil { - return 0, err - } - return len(payload), nil -} - -func (w *bytesToBufferWriter) WriteMultiBuffer(mb MultiBuffer) error { - return w.writer.Write(mb) -} - -func (w *bytesToBufferWriter) ReadFrom(reader io.Reader) (int64, error) { - mbReader := NewReader(reader) - totalBytes := int64(0) - for { - mb, err := mbReader.Read() - if errors.Cause(err) == io.EOF { - break - } else if err != nil { - return totalBytes, err - } - totalBytes += int64(mb.Len()) - if err := w.writer.Write(mb); err != nil { - return totalBytes, err - } - } - return totalBytes, nil -} - type noOpWriter struct{} -func (noOpWriter) Write(b MultiBuffer) error { +func (noOpWriter) WriteMultiBuffer(b MultiBuffer) error { b.Release() return nil } diff --git a/common/buf/writer_test.go b/common/buf/writer_test.go index 0dfef9b0..3f64411d 100644 --- a/common/buf/writer_test.go +++ b/common/buf/writer_test.go @@ -25,9 +25,11 @@ func TestWriter(t *testing.T) { writeBuffer := bytes.NewBuffer(make([]byte, 0, 1024*1024)) - writer := NewWriter(NewBufferedWriter(writeBuffer)) - err := writer.Write(NewMultiBufferValue(lb)) + writer := NewBufferedWriter(NewWriter(writeBuffer)) + writer.SetBuffered(false) + err := writer.WriteMultiBuffer(NewMultiBufferValue(lb)) assert(err, IsNil) + assert(writer.Flush(), IsNil) assert(expectedBytes, Equals, writeBuffer.Bytes()) } @@ -36,20 +38,21 @@ func TestBytesWriterReadFrom(t *testing.T) { cache := ray.NewStream(context.Background()) reader := bufio.NewReader(io.LimitReader(rand.Reader, 8192)) - _, err := reader.WriteTo(ToBytesWriter(cache)) + writer := NewBufferedWriter(cache) + writer.SetBuffered(false) + _, err := reader.WriteTo(writer) assert(err, IsNil) - mb, err := cache.Read() + mb, err := cache.ReadMultiBuffer() assert(err, IsNil) assert(mb.Len(), Equals, 8192) - assert(len(mb), Equals, 4) } func TestDiscardBytes(t *testing.T) { assert := With(t) b := New() - common.Must(b.Reset(ReadFrom(rand.Reader))) + common.Must(b.Reset(ReadFullFrom(rand.Reader, Size))) nBytes, err := io.Copy(DiscardBytes, b) assert(nBytes, Equals, int64(Size)) @@ -64,7 +67,7 @@ func TestDiscardBytesMultiBuffer(t *testing.T) { common.Must2(buffer.ReadFrom(io.LimitReader(rand.Reader, size))) r := NewReader(buffer) - nBytes, err := io.Copy(DiscardBytes, ToBytesReader(r)) + nBytes, err := io.Copy(DiscardBytes, NewBufferedReader(r)) assert(nBytes, Equals, int64(size)) assert(err, IsNil) } diff --git a/common/crypto/auth.go b/common/crypto/auth.go index 289e14f2..cd29a6a0 100644 --- a/common/crypto/auth.go +++ b/common/crypto/auth.go @@ -151,7 +151,7 @@ func (r *AuthenticationReader) readChunk(waitForData bool) ([]byte, error) { return b, nil } -func (r *AuthenticationReader) Read() (buf.MultiBuffer, error) { +func (r *AuthenticationReader) ReadMultiBuffer() (buf.MultiBuffer, error) { b, err := r.readChunk(true) if err != nil { return nil, err @@ -193,81 +193,97 @@ func (r *AuthenticationReader) Read() (buf.MultiBuffer, error) { return mb, nil } +const ( + WriteSize = 1024 +) + type AuthenticationWriter struct { auth Authenticator - buffer []byte - payload []byte - writer *buf.BufferedWriter + writer buf.Writer sizeParser ChunkSizeEncoder transferType protocol.TransferType } func NewAuthenticationWriter(auth Authenticator, sizeParser ChunkSizeEncoder, writer io.Writer, transferType protocol.TransferType) *AuthenticationWriter { - const payloadSize = 1024 return &AuthenticationWriter{ auth: auth, - buffer: make([]byte, payloadSize+sizeParser.SizeBytes()+auth.Overhead()), - payload: make([]byte, payloadSize), - writer: buf.NewBufferedWriterSize(writer, readerBufferSize), + writer: buf.NewWriter(writer), sizeParser: sizeParser, transferType: transferType, } } -func (w *AuthenticationWriter) append(b []byte) error { - encryptedSize := len(b) + w.auth.Overhead() - buffer := w.sizeParser.Encode(uint16(encryptedSize), w.buffer[:0]) +func (w *AuthenticationWriter) seal(b *buf.Buffer) (*buf.Buffer, error) { + encryptedSize := b.Len() + w.auth.Overhead() - buffer, err := w.auth.Seal(buffer, b) - if err != nil { - return err + eb := buf.New() + common.Must(eb.Reset(func(bb []byte) (int, error) { + w.sizeParser.Encode(uint16(encryptedSize), bb[:0]) + return w.sizeParser.SizeBytes(), nil + })) + if err := eb.AppendSupplier(func(bb []byte) (int, error) { + _, err := w.auth.Seal(bb[:0], b.Bytes()) + return encryptedSize, err + }); err != nil { + eb.Release() + return nil, err } - if _, err := w.writer.Write(buffer); err != nil { - return err - } - - return nil + return eb, nil } func (w *AuthenticationWriter) writeStream(mb buf.MultiBuffer) error { defer mb.Release() + mb2Write := buf.NewMultiBufferCap(len(mb) + 10) + for { - n, _ := mb.Read(w.payload) - if err := w.append(w.payload[:n]); err != nil { + b := buf.New() + common.Must(b.Reset(func(bb []byte) (int, error) { + return mb.Read(bb[:WriteSize]) + })) + eb, err := w.seal(b) + b.Release() + + if err != nil { + mb2Write.Release() return err } + mb2Write.Append(eb) if mb.IsEmpty() { break } } - return w.writer.Flush() + return w.writer.WriteMultiBuffer(mb2Write) } func (w *AuthenticationWriter) writePacket(mb buf.MultiBuffer) error { defer mb.Release() + mb2Write := buf.NewMultiBufferCap(len(mb) * 2) + for { b := mb.SplitFirst() if b == nil { b = buf.New() } - if err := w.append(b.Bytes()); err != nil { - b.Release() + eb, err := w.seal(b) + b.Release() + if err != nil { + mb2Write.Release() return err } - b.Release() + mb2Write.Append(eb) if mb.IsEmpty() { break } } - return w.writer.Flush() + return w.writer.WriteMultiBuffer(mb2Write) } -func (w *AuthenticationWriter) Write(mb buf.MultiBuffer) error { +func (w *AuthenticationWriter) WriteMultiBuffer(mb buf.MultiBuffer) error { if w.transferType == protocol.TransferTypeStream { return w.writeStream(mb) } diff --git a/common/crypto/auth_test.go b/common/crypto/auth_test.go index 602fa34e..4016dc51 100644 --- a/common/crypto/auth_test.go +++ b/common/crypto/auth_test.go @@ -42,9 +42,9 @@ func TestAuthenticationReaderWriter(t *testing.T) { AdditionalDataGenerator: &NoOpBytesGenerator{}, }, PlainChunkSizeParser{}, cache, protocol.TransferTypeStream) - assert(writer.Write(buf.NewMultiBufferValue(payload)), IsNil) + assert(writer.WriteMultiBuffer(buf.NewMultiBufferValue(payload)), IsNil) assert(cache.Len(), Equals, 83360) - assert(writer.Write(buf.MultiBuffer{}), IsNil) + assert(writer.WriteMultiBuffer(buf.MultiBuffer{}), IsNil) assert(err, IsNil) reader := NewAuthenticationReader(&AEADAuthenticator{ @@ -58,7 +58,7 @@ func TestAuthenticationReaderWriter(t *testing.T) { var mb buf.MultiBuffer for mb.Len() < len(rawPayload) { - mb2, err := reader.Read() + mb2, err := reader.ReadMultiBuffer() assert(err, IsNil) mb.AppendMulti(mb2) @@ -68,7 +68,7 @@ func TestAuthenticationReaderWriter(t *testing.T) { mb.Read(mbContent) assert(mbContent, Equals, rawPayload) - _, err = reader.Read() + _, err = reader.ReadMultiBuffer() assert(err, Equals, io.EOF) } @@ -104,9 +104,9 @@ func TestAuthenticationReaderWriterPacket(t *testing.T) { pb2.Append([]byte("efgh")) payload.Append(pb2) - assert(writer.Write(payload), IsNil) + assert(writer.WriteMultiBuffer(payload), IsNil) assert(cache.Len(), GreaterThan, 0) - assert(writer.Write(buf.MultiBuffer{}), IsNil) + assert(writer.WriteMultiBuffer(buf.MultiBuffer{}), IsNil) assert(err, IsNil) reader := NewAuthenticationReader(&AEADAuthenticator{ @@ -117,7 +117,7 @@ func TestAuthenticationReaderWriterPacket(t *testing.T) { AdditionalDataGenerator: &NoOpBytesGenerator{}, }, PlainChunkSizeParser{}, cache, protocol.TransferTypePacket) - mb, err := reader.Read() + mb, err := reader.ReadMultiBuffer() assert(err, IsNil) b1 := mb.SplitFirst() @@ -126,6 +126,6 @@ func TestAuthenticationReaderWriterPacket(t *testing.T) { assert(b2.String(), Equals, "efgh") assert(mb.IsEmpty(), IsTrue) - _, err = reader.Read() + _, err = reader.ReadMultiBuffer() assert(err, Equals, io.EOF) } diff --git a/common/crypto/chunk.go b/common/crypto/chunk.go index af43e346..c66a107b 100644 --- a/common/crypto/chunk.go +++ b/common/crypto/chunk.go @@ -48,7 +48,7 @@ func NewChunkStreamReader(sizeDecoder ChunkSizeDecoder, reader io.Reader) *Chunk sizeDecoder: sizeDecoder, reader: buf.NewReader(reader), buffer: make([]byte, sizeDecoder.SizeBytes()), - leftOver: buf.NewMultiBufferCap(16), + leftOver: buf.NewMultiBufferCap(16), } } @@ -56,7 +56,7 @@ func (r *ChunkStreamReader) readAtLeast(size int) error { mb := r.leftOver r.leftOver = nil for mb.Len() < size { - extra, err := r.reader.Read() + extra, err := r.reader.ReadMultiBuffer() if err != nil { mb.Release() return err @@ -78,7 +78,7 @@ func (r *ChunkStreamReader) readSize() (uint16, error) { return r.sizeDecoder.Decode(r.buffer) } -func (r *ChunkStreamReader) Read() (buf.MultiBuffer, error) { +func (r *ChunkStreamReader) ReadMultiBuffer() (buf.MultiBuffer, error) { size := r.leftOverSize if size == 0 { nextSize, err := r.readSize() @@ -129,10 +129,10 @@ func NewChunkStreamWriter(sizeEncoder ChunkSizeEncoder, writer io.Writer) *Chunk } } -func (w *ChunkStreamWriter) Write(mb buf.MultiBuffer) error { +func (w *ChunkStreamWriter) WriteMultiBuffer(mb buf.MultiBuffer) error { const sliceSize = 8192 mbLen := mb.Len() - mb2Write := buf.NewMultiBufferCap(mbLen / buf.Size + mbLen / sliceSize + 2) + mb2Write := buf.NewMultiBufferCap(mbLen/buf.Size + mbLen/sliceSize + 2) for { slice := mb.SliceBySize(sliceSize) @@ -150,5 +150,5 @@ func (w *ChunkStreamWriter) Write(mb buf.MultiBuffer) error { } } - return w.writer.Write(mb2Write) + return w.writer.WriteMultiBuffer(mb2Write) } diff --git a/common/crypto/chunk_test.go b/common/crypto/chunk_test.go index 2c9763cb..4131ebfb 100644 --- a/common/crypto/chunk_test.go +++ b/common/crypto/chunk_test.go @@ -19,26 +19,26 @@ func TestChunkStreamIO(t *testing.T) { b := buf.New() b.AppendBytes('a', 'b', 'c', 'd') - assert(writer.Write(buf.NewMultiBufferValue(b)), IsNil) + assert(writer.WriteMultiBuffer(buf.NewMultiBufferValue(b)), IsNil) b = buf.New() b.AppendBytes('e', 'f', 'g') - assert(writer.Write(buf.NewMultiBufferValue(b)), IsNil) + assert(writer.WriteMultiBuffer(buf.NewMultiBufferValue(b)), IsNil) - assert(writer.Write(buf.MultiBuffer{}), IsNil) + assert(writer.WriteMultiBuffer(buf.MultiBuffer{}), IsNil) assert(cache.Len(), Equals, 13) - mb, err := reader.Read() + mb, err := reader.ReadMultiBuffer() assert(err, IsNil) assert(mb.Len(), Equals, 4) assert(mb[0].Bytes(), Equals, []byte("abcd")) - mb, err = reader.Read() + mb, err = reader.ReadMultiBuffer() assert(err, IsNil) assert(mb.Len(), Equals, 3) assert(mb[0].Bytes(), Equals, []byte("efg")) - _, err = reader.Read() + _, err = reader.ReadMultiBuffer() assert(err, Equals, io.EOF) } diff --git a/common/crypto/io.go b/common/crypto/io.go index cc595f17..295ba472 100644 --- a/common/crypto/io.go +++ b/common/crypto/io.go @@ -28,7 +28,7 @@ func (r *CryptionReader) Read(data []byte) (int, error) { } var ( - _ buf.MultiBufferWriter = (*CryptionWriter)(nil) + _ buf.Writer = (*CryptionWriter)(nil) ) type CryptionWriter struct { diff --git a/proxy/blackhole/config.go b/proxy/blackhole/config.go index 88c58c9a..5bfd3290 100644 --- a/proxy/blackhole/config.go +++ b/proxy/blackhole/config.go @@ -29,7 +29,7 @@ func (*NoneResponse) WriteTo(buf.Writer) {} func (*HTTPResponse) WriteTo(writer buf.Writer) { b := buf.NewLocal(512) common.Must(b.AppendSupplier(serial.WriteString(http403response))) - writer.Write(buf.NewMultiBufferValue(b)) + writer.WriteMultiBuffer(buf.NewMultiBufferValue(b)) } // GetInternalResponse converts response settings from proto to internal data structure. diff --git a/proxy/http/server.go b/proxy/http/server.go index 9c3f06af..484389dd 100644 --- a/proxy/http/server.go +++ b/proxy/http/server.go @@ -255,15 +255,18 @@ func (s *Server) handlePlainHTTP(ctx context.Context, request *http.Request, rea requestDone := signal.ExecuteAsync(func() error { request.Header.Set("Connection", "close") - requestWriter := buf.ToBytesWriter(ray.InboundInput()) + requestWriter := buf.NewBufferedWriter(ray.InboundInput()) if err := request.Write(requestWriter); err != nil { return err } + if err := requestWriter.Flush(); err != nil { + return err + } return nil }) responseDone := signal.ExecuteAsync(func() error { - responseReader := bufio.NewReaderSize(buf.ToBytesReader(ray.InboundOutput()), 2048) + responseReader := bufio.NewReaderSize(buf.NewBufferedReader(ray.InboundOutput()), 2048) response, err := http.ReadResponse(responseReader, request) if err == nil { StripHopByHopHeaders(response.Header) diff --git a/proxy/shadowsocks/client.go b/proxy/shadowsocks/client.go index 0470b646..04581357 100644 --- a/proxy/shadowsocks/client.go +++ b/proxy/shadowsocks/client.go @@ -93,7 +93,7 @@ func (v *Client) Process(ctx context.Context, outboundRay ray.OutboundRay, diale ctx, timer := signal.CancelAfterInactivity(ctx, time.Minute*5) if request.Command == protocol.RequestCommandTCP { - bufferedWriter := buf.NewBufferedWriter(conn) + bufferedWriter := buf.NewBufferedWriter(buf.NewWriter(conn)) bodyWriter, err := WriteTCPRequest(request, bufferedWriter) if err != nil { return newError("failed to write request").Base(err) diff --git a/proxy/shadowsocks/ota.go b/proxy/shadowsocks/ota.go index eb8e3707..91549b82 100644 --- a/proxy/shadowsocks/ota.go +++ b/proxy/shadowsocks/ota.go @@ -68,7 +68,7 @@ func NewChunkReader(reader io.Reader, auth *Authenticator) *ChunkReader { } } -func (v *ChunkReader) Read() (buf.MultiBuffer, error) { +func (v *ChunkReader) ReadMultiBuffer() (buf.MultiBuffer, error) { buffer := buf.New() if err := buffer.AppendSupplier(buf.ReadFullFrom(v.reader, 2)); err != nil { buffer.Release() @@ -117,8 +117,8 @@ func NewChunkWriter(writer io.Writer, auth *Authenticator) *ChunkWriter { } } -// Write implements buf.MultiBufferWriter. -func (w *ChunkWriter) Write(mb buf.MultiBuffer) error { +// WriteMultiBuffer implements buf.Writer. +func (w *ChunkWriter) WriteMultiBuffer(mb buf.MultiBuffer) error { defer mb.Release() for { diff --git a/proxy/shadowsocks/ota_test.go b/proxy/shadowsocks/ota_test.go index b93d55a6..95064444 100644 --- a/proxy/shadowsocks/ota_test.go +++ b/proxy/shadowsocks/ota_test.go @@ -16,7 +16,7 @@ func TestNormalChunkReading(t *testing.T) { 0, 8, 39, 228, 69, 96, 133, 39, 254, 26, 201, 70, 11, 12, 13, 14, 15, 16, 17, 18) reader := NewChunkReader(buffer, NewAuthenticator(ChunkKeyGenerator( []byte{21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36}))) - payload, err := reader.Read() + payload, err := reader.ReadMultiBuffer() assert(err, IsNil) assert(payload[0].Bytes(), Equals, []byte{11, 12, 13, 14, 15, 16, 17, 18}) } @@ -30,7 +30,7 @@ func TestNormalChunkWriting(t *testing.T) { b := buf.NewLocal(256) b.Append([]byte{11, 12, 13, 14, 15, 16, 17, 18}) - err := writer.Write(buf.NewMultiBufferValue(b)) + err := writer.WriteMultiBuffer(buf.NewMultiBufferValue(b)) assert(err, IsNil) assert(buffer.Bytes(), Equals, []byte{0, 8, 39, 228, 69, 96, 133, 39, 254, 26, 201, 70, 11, 12, 13, 14, 15, 16, 17, 18}) } diff --git a/proxy/shadowsocks/protocol.go b/proxy/shadowsocks/protocol.go index 529b2cb2..c4454895 100644 --- a/proxy/shadowsocks/protocol.go +++ b/proxy/shadowsocks/protocol.go @@ -362,7 +362,7 @@ type UDPReader struct { User *protocol.User } -func (v *UDPReader) Read() (buf.MultiBuffer, error) { +func (v *UDPReader) ReadMultiBuffer() (buf.MultiBuffer, error) { buffer := buf.New() err := buffer.AppendSupplier(buf.ReadFrom(v.Reader)) if err != nil { diff --git a/proxy/shadowsocks/protocol_test.go b/proxy/shadowsocks/protocol_test.go index 763bd26b..f2cb3c0a 100644 --- a/proxy/shadowsocks/protocol_test.go +++ b/proxy/shadowsocks/protocol_test.go @@ -112,14 +112,14 @@ func TestTCPRequest(t *testing.T) { writer, err := WriteTCPRequest(request, cache) assert(err, IsNil) - assert(writer.Write(buf.NewMultiBufferValue(data)), IsNil) + assert(writer.WriteMultiBuffer(buf.NewMultiBufferValue(data)), IsNil) decodedRequest, reader, err := ReadTCPSession(request.User, cache) assert(err, IsNil) assert(decodedRequest.Address, Equals, request.Address) assert(decodedRequest.Port, Equals, request.Port) - decodedData, err := reader.Read() + decodedData, err := reader.ReadMultiBuffer() assert(err, IsNil) assert(decodedData[0].String(), Equals, string(payload)) } @@ -158,19 +158,19 @@ func TestUDPReaderWriter(t *testing.T) { b := buf.New() b.AppendSupplier(serial.WriteString("test payload")) - err := writer.Write(buf.NewMultiBufferValue(b)) + err := writer.WriteMultiBuffer(buf.NewMultiBufferValue(b)) assert(err, IsNil) - payload, err := reader.Read() + payload, err := reader.ReadMultiBuffer() assert(err, IsNil) assert(payload[0].String(), Equals, "test payload") b = buf.New() b.AppendSupplier(serial.WriteString("test payload 2")) - err = writer.Write(buf.NewMultiBufferValue(b)) + err = writer.WriteMultiBuffer(buf.NewMultiBufferValue(b)) assert(err, IsNil) - payload, err = reader.Read() + payload, err = reader.ReadMultiBuffer() assert(err, IsNil) assert(payload[0].String(), Equals, "test payload 2") } diff --git a/proxy/shadowsocks/server.go b/proxy/shadowsocks/server.go index be28b5dd..0e52ed3b 100644 --- a/proxy/shadowsocks/server.go +++ b/proxy/shadowsocks/server.go @@ -74,7 +74,7 @@ func (s *Server) handlerUDPPayload(ctx context.Context, conn internet.Connection reader := buf.NewReader(conn) for { - mpayload, err := reader.Read() + mpayload, err := reader.ReadMultiBuffer() if err != nil { break } @@ -129,7 +129,7 @@ func (s *Server) handlerUDPPayload(ctx context.Context, conn internet.Connection func (s *Server) handleConnection(ctx context.Context, conn internet.Connection, dispatcher dispatcher.Interface) error { conn.SetReadDeadline(time.Now().Add(time.Second * 8)) - bufferedReader := buf.NewBufferedReader(conn) + bufferedReader := buf.NewBufferedReader(buf.NewReader(conn)) request, bodyReader, err := ReadTCPSession(s.user, bufferedReader) if err != nil { log.Access(conn.RemoteAddr(), "", log.AccessRejected, err) @@ -153,17 +153,17 @@ func (s *Server) handleConnection(ctx context.Context, conn internet.Connection, } responseDone := signal.ExecuteAsync(func() error { - bufferedWriter := buf.NewBufferedWriter(conn) + bufferedWriter := buf.NewBufferedWriter(buf.NewWriter(conn)) responseWriter, err := WriteTCPResponse(request, bufferedWriter) if err != nil { return newError("failed to write response").Base(err) } - payload, err := ray.InboundOutput().Read() + payload, err := ray.InboundOutput().ReadMultiBuffer() if err != nil { return err } - if err := responseWriter.Write(payload); err != nil { + if err := responseWriter.WriteMultiBuffer(payload); err != nil { return err } payload.Release() diff --git a/proxy/socks/protocol.go b/proxy/socks/protocol.go index f956b6f0..f5f25520 100644 --- a/proxy/socks/protocol.go +++ b/proxy/socks/protocol.go @@ -352,7 +352,7 @@ func NewUDPReader(reader io.Reader) *UDPReader { return &UDPReader{reader: reader} } -func (r *UDPReader) Read() (buf.MultiBuffer, error) { +func (r *UDPReader) ReadMultiBuffer() (buf.MultiBuffer, error) { b := buf.New() if err := b.AppendSupplier(buf.ReadFrom(r.reader)); err != nil { return nil, err diff --git a/proxy/socks/protocol_test.go b/proxy/socks/protocol_test.go index 61f2d8db..a5cb18cf 100644 --- a/proxy/socks/protocol_test.go +++ b/proxy/socks/protocol_test.go @@ -24,11 +24,11 @@ func TestUDPEncoding(t *testing.T) { content := []byte{'a'} payload := buf.New() payload.Append(content) - assert(writer.Write(buf.NewMultiBufferValue(payload)), IsNil) + assert(writer.WriteMultiBuffer(buf.NewMultiBufferValue(payload)), IsNil) reader := NewUDPReader(b) - decodedPayload, err := reader.Read() + decodedPayload, err := reader.ReadMultiBuffer() assert(err, IsNil) assert(decodedPayload[0].Bytes(), Equals, content) } diff --git a/proxy/socks/server.go b/proxy/socks/server.go index defa7791..ec3d74e2 100644 --- a/proxy/socks/server.go +++ b/proxy/socks/server.go @@ -58,7 +58,7 @@ func (s *Server) Process(ctx context.Context, network net.Network, conn internet func (s *Server) processTCP(ctx context.Context, conn internet.Connection, dispatcher dispatcher.Interface) error { conn.SetReadDeadline(time.Now().Add(time.Second * 8)) - reader := buf.NewBufferedReader(conn) + reader := buf.NewBufferedReader(buf.NewReader(conn)) inboundDest, ok := proxy.InboundEntryPointFromContext(ctx) if !ok { @@ -154,7 +154,7 @@ func (v *Server) handleUDPPayload(ctx context.Context, conn internet.Connection, reader := buf.NewReader(conn) for { - mpayload, err := reader.Read() + mpayload, err := reader.ReadMultiBuffer() if err != nil { return err } diff --git a/proxy/vmess/inbound/inbound.go b/proxy/vmess/inbound/inbound.go index faff1340..46b5a6b3 100644 --- a/proxy/vmess/inbound/inbound.go +++ b/proxy/vmess/inbound/inbound.go @@ -142,12 +142,12 @@ func transferResponse(timer signal.ActivityUpdater, session *encoding.ServerSess bodyWriter := session.EncodeResponseBody(request, output) // Optimize for small response packet - data, err := input.Read() + data, err := input.ReadMultiBuffer() if err != nil { return err } - if err := bodyWriter.Write(data); err != nil { + if err := bodyWriter.WriteMultiBuffer(data); err != nil { return err } data.Release() @@ -163,7 +163,7 @@ func transferResponse(timer signal.ActivityUpdater, session *encoding.ServerSess } if request.Option.Has(protocol.RequestOptionChunkStream) { - if err := bodyWriter.Write(buf.MultiBuffer{}); err != nil { + if err := bodyWriter.WriteMultiBuffer(buf.MultiBuffer{}); err != nil { return err } } @@ -177,7 +177,7 @@ func (v *Handler) Process(ctx context.Context, network net.Network, connection i return err } - reader := buf.NewBufferedReader(connection) + reader := buf.NewBufferedReader(buf.NewReader(connection)) session := encoding.NewServerSession(v.clients, v.sessionHistory) request, err := session.DecodeRequestHeader(reader) @@ -213,14 +213,12 @@ func (v *Handler) Process(ctx context.Context, network net.Network, connection i input := ray.InboundInput() output := ray.InboundOutput() - reader.SetBuffered(false) - requestDone := signal.ExecuteAsync(func() error { return transferRequest(timer, session, request, reader, input) }) responseDone := signal.ExecuteAsync(func() error { - writer := buf.NewBufferedWriter(connection) + writer := buf.NewBufferedWriter(buf.NewWriter(connection)) defer writer.Flush() response := &protocol.ResponseHeader{ diff --git a/proxy/vmess/outbound/outbound.go b/proxy/vmess/outbound/outbound.go index a883d1fb..aac6094d 100644 --- a/proxy/vmess/outbound/outbound.go +++ b/proxy/vmess/outbound/outbound.go @@ -106,7 +106,7 @@ func (v *Handler) Process(ctx context.Context, outboundRay ray.OutboundRay, dial ctx, timer := signal.CancelAfterInactivity(ctx, time.Minute*5) requestDone := signal.ExecuteAsync(func() error { - writer := buf.NewBufferedWriter(conn) + writer := buf.NewBufferedWriter(buf.NewWriter(conn)) if err := session.EncodeRequestHeader(request, writer); err != nil { return newError("failed to encode request").Base(err).AtWarning() } @@ -117,7 +117,7 @@ func (v *Handler) Process(ctx context.Context, outboundRay ray.OutboundRay, dial return newError("failed to get first payload").Base(err) } if !firstPayload.IsEmpty() { - if err := bodyWriter.Write(firstPayload); err != nil { + if err := bodyWriter.WriteMultiBuffer(firstPayload); err != nil { return newError("failed to write first payload").Base(err) } firstPayload.Release() @@ -132,7 +132,7 @@ func (v *Handler) Process(ctx context.Context, outboundRay ray.OutboundRay, dial } if request.Option.Has(protocol.RequestOptionChunkStream) { - if err := bodyWriter.Write(buf.MultiBuffer{}); err != nil { + if err := bodyWriter.WriteMultiBuffer(buf.MultiBuffer{}); err != nil { return err } } @@ -142,7 +142,7 @@ func (v *Handler) Process(ctx context.Context, outboundRay ray.OutboundRay, dial responseDone := signal.ExecuteAsync(func() error { defer output.Close() - reader := buf.NewBufferedReader(conn) + reader := buf.NewBufferedReader(buf.NewReader(conn)) header, err := session.DecodeResponseHeader(reader) if err != nil { return err diff --git a/transport/internet/kcp/connection.go b/transport/internet/kcp/connection.go index f20ab562..5551fab6 100644 --- a/transport/internet/kcp/connection.go +++ b/transport/internet/kcp/connection.go @@ -169,8 +169,7 @@ type SystemConnection interface { } var ( - _ buf.MultiBufferReader = (*Connection)(nil) - _ buf.MultiBufferWriter = (*Connection)(nil) + _ buf.Reader = (*Connection)(nil) ) // Connection is a KCP connection over UDP. @@ -265,7 +264,7 @@ func (v *Connection) OnDataOutput() { } } -// ReadMultiBuffer implements buf.MultiBufferReader. +// ReadMultiBuffer implements buf.Reader. func (v *Connection) ReadMultiBuffer() (buf.MultiBuffer, error) { if v == nil { return nil, io.EOF @@ -375,13 +374,6 @@ func (v *Connection) Write(b []byte) (int, error) { } } -func (c *Connection) WriteMultiBuffer(mb buf.MultiBuffer) error { - if c.mergingWriter == nil { - c.mergingWriter = buf.NewMergingWriterSize(c, c.mss) - } - return c.mergingWriter.Write(mb) -} - func (v *Connection) SetState(state State) { current := v.Elapsed() atomic.StoreInt32((*int32)(&v.state), int32(state)) diff --git a/transport/internet/tls/tls.go b/transport/internet/tls/tls.go index 42ade5f7..c9b6e6f4 100644 --- a/transport/internet/tls/tls.go +++ b/transport/internet/tls/tls.go @@ -10,29 +10,23 @@ import ( //go:generate go run $GOPATH/src/v2ray.com/core/tools/generrorgen/main.go -pkg tls -path Transport,Internet,TLS var ( - _ buf.MultiBufferReader = (*conn)(nil) - _ buf.MultiBufferWriter = (*conn)(nil) + _ buf.Writer = (*conn)(nil) ) type conn struct { net.Conn - mergingReader buf.Reader - mergingWriter buf.Writer -} - -func (c *conn) ReadMultiBuffer() (buf.MultiBuffer, error) { - if c.mergingReader == nil { - c.mergingReader = buf.NewBytesToBufferReader(c.Conn) - } - return c.mergingReader.Read() + mergingWriter *buf.BufferedWriter } func (c *conn) WriteMultiBuffer(mb buf.MultiBuffer) error { if c.mergingWriter == nil { - c.mergingWriter = buf.NewMergingWriter(c.Conn) + c.mergingWriter = buf.NewBufferedWriter(buf.NewWriter(c.Conn)) } - return c.mergingWriter.Write(mb) + if err := c.mergingWriter.WriteMultiBuffer(mb); err != nil { + return err + } + return c.mergingWriter.Flush() } func Client(c net.Conn, config *tls.Config) net.Conn { diff --git a/transport/internet/udp/dispatcher.go b/transport/internet/udp/dispatcher.go index ab9e8b00..8b116614 100644 --- a/transport/internet/udp/dispatcher.go +++ b/transport/internet/udp/dispatcher.go @@ -57,7 +57,7 @@ func (v *Dispatcher) Dispatch(ctx context.Context, destination net.Destination, inboundRay, existing := v.getInboundRay(ctx, destination) outputStream := inboundRay.InboundInput() if outputStream != nil { - if err := outputStream.Write(buf.NewMultiBufferValue(payload)); err != nil { + if err := outputStream.WriteMultiBuffer(buf.NewMultiBufferValue(payload)); err != nil { v.RemoveRay(destination) } } @@ -71,7 +71,7 @@ func (v *Dispatcher) Dispatch(ctx context.Context, destination net.Destination, func handleInput(input ray.InputStream, callback ResponseCallback) { for { - mb, err := input.Read() + mb, err := input.ReadMultiBuffer() if err != nil { break } diff --git a/transport/internet/udp/dispatcher_test.go b/transport/internet/udp/dispatcher_test.go index b780ab16..76a939e7 100644 --- a/transport/internet/udp/dispatcher_test.go +++ b/transport/internet/udp/dispatcher_test.go @@ -28,11 +28,11 @@ func TestSameDestinationDispatching(t *testing.T) { link := ray.NewRay(ctx) go func() { for { - data, err := link.OutboundInput().Read() + data, err := link.OutboundInput().ReadMultiBuffer() if err != nil { break } - err = link.OutboundOutput().Write(data) + err = link.OutboundOutput().WriteMultiBuffer(data) assert(err, IsNil) } }() diff --git a/transport/internet/websocket/connection.go b/transport/internet/websocket/connection.go index bcdde3cf..d4e77432 100644 --- a/transport/internet/websocket/connection.go +++ b/transport/internet/websocket/connection.go @@ -11,8 +11,7 @@ import ( ) var ( - _ buf.MultiBufferReader = (*connection)(nil) - _ buf.MultiBufferWriter = (*connection)(nil) + _ buf.Writer = (*connection)(nil) ) // connection is a wrapper for net.Conn over WebSocket connection. @@ -20,8 +19,7 @@ type connection struct { conn *websocket.Conn reader io.Reader - mergingReader buf.Reader - mergingWriter buf.Writer + mergingWriter *buf.BufferedWriter } func newConnection(conn *websocket.Conn) *connection { @@ -47,13 +45,6 @@ func (c *connection) Read(b []byte) (int, error) { } } -func (c *connection) ReadMultiBuffer() (buf.MultiBuffer, error) { - if c.mergingReader == nil { - c.mergingReader = buf.NewBytesToBufferReader(c) - } - return c.mergingReader.Read() -} - func (c *connection) getReader() (io.Reader, error) { if c.reader != nil { return c.reader, nil @@ -77,9 +68,12 @@ func (c *connection) Write(b []byte) (int, error) { func (c *connection) WriteMultiBuffer(mb buf.MultiBuffer) error { if c.mergingWriter == nil { - c.mergingWriter = buf.NewMergingWriter(c) + c.mergingWriter = buf.NewBufferedWriter(buf.NewBufferToBytesWriter(c)) } - return c.mergingWriter.Write(mb) + if err := c.mergingWriter.WriteMultiBuffer(mb); err != nil { + return err + } + return c.mergingWriter.Flush() } func (c *connection) Close() error { diff --git a/transport/ray/direct.go b/transport/ray/direct.go index 2378e394..2df368b4 100644 --- a/transport/ray/direct.go +++ b/transport/ray/direct.go @@ -106,7 +106,7 @@ func (s *Stream) Peek(b *buf.Buffer) { } // Read reads data from the Stream. -func (s *Stream) Read() (buf.MultiBuffer, error) { +func (s *Stream) ReadMultiBuffer() (buf.MultiBuffer, error) { for { mb, err := s.getData() if err != nil { @@ -178,7 +178,7 @@ func (s *Stream) waitForStreamSize() error { } // Write writes more data into the Stream. -func (s *Stream) Write(data buf.MultiBuffer) error { +func (s *Stream) WriteMultiBuffer(data buf.MultiBuffer) error { if data.IsEmpty() { return nil } diff --git a/transport/ray/direct_test.go b/transport/ray/direct_test.go index 4350d7ca..64c0ab1d 100644 --- a/transport/ray/direct_test.go +++ b/transport/ray/direct_test.go @@ -16,18 +16,18 @@ func TestStreamIO(t *testing.T) { stream := NewStream(context.Background()) b1 := buf.New() b1.AppendBytes('a') - assert(stream.Write(buf.NewMultiBufferValue(b1)), IsNil) + assert(stream.WriteMultiBuffer(buf.NewMultiBufferValue(b1)), IsNil) - _, err := stream.Read() + _, err := stream.ReadMultiBuffer() assert(err, IsNil) stream.Close() - _, err = stream.Read() + _, err = stream.ReadMultiBuffer() assert(err, Equals, io.EOF) b2 := buf.New() b2.AppendBytes('b') - err = stream.Write(buf.NewMultiBufferValue(b2)) + err = stream.WriteMultiBuffer(buf.NewMultiBufferValue(b2)) assert(err, Equals, io.ErrClosedPipe) } @@ -37,13 +37,13 @@ func TestStreamClose(t *testing.T) { stream := NewStream(context.Background()) b1 := buf.New() b1.AppendBytes('a') - assert(stream.Write(buf.NewMultiBufferValue(b1)), IsNil) + assert(stream.WriteMultiBuffer(buf.NewMultiBufferValue(b1)), IsNil) stream.Close() - _, err := stream.Read() + _, err := stream.ReadMultiBuffer() assert(err, IsNil) - _, err = stream.Read() + _, err = stream.ReadMultiBuffer() assert(err, Equals, io.EOF) } From 6f514968790e00a7a5b10fed557c0d6ff9b5628a Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Thu, 9 Nov 2017 22:43:13 +0100 Subject: [PATCH 120/229] Update version --- core.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core.go b/core.go index 567e2634..c8867d1d 100644 --- a/core.go +++ b/core.go @@ -18,7 +18,7 @@ import ( ) var ( - version = "2.47" + version = "2.48" build = "Custom" codename = "One for all" intro = "An unified platform for anti-censorship." From c4bf58dc50abc8e5ea90ec85e07b06596abf9f83 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Thu, 9 Nov 2017 23:10:09 +0100 Subject: [PATCH 121/229] allow release script to access cloud storage --- tools/release/make-release.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/release/make-release.sh b/tools/release/make-release.sh index df1ea1ef..387e1bdc 100755 --- a/tools/release/make-release.sh +++ b/tools/release/make-release.sh @@ -41,4 +41,6 @@ gcloud compute instances create "v2raycore-${RAND}" \ --metadata=release_tag=v${VER},prerelease=${PRE} \ --metadata-from-file=startup-script=${DIR}/release-ci.sh \ --zone=us-central1-c \ - --project ${PROJECT} + --project ${PROJECT} \ + --scopes "https://www.googleapis.com/auth/compute,https://www.googleapis.com/auth/devstorage.read_write" \ + From 2c62346011a8545b2ce9f003ba018f626a20835c Mon Sep 17 00:00:00 2001 From: ToutyRater Date: Fri, 10 Nov 2017 12:38:32 +0000 Subject: [PATCH 122/229] typo --- release/install-release.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release/install-release.sh b/release/install-release.sh index 22f1d8af..3340c7cf 100755 --- a/release/install-release.sh +++ b/release/install-release.sh @@ -271,7 +271,7 @@ installInitScrip(){ } Help(){ - echo "./install-release.sh [-h] [-c] [-p proxy] [-f] [-v vx.y.z] [-l file]" + echo "./install-release.sh [-h] [-c] [-p proxy] [-f] [--version vx.y.z] [-l file]" echo " -h, --help Show help" echo " -p, --proxy To download through a proxy server, use -p socks5://127.0.0.1:1080 or -p http://127.0.0.1:3128 etc" echo " -f, --force Force install" From 901d13ca76b1e75ace9daba8defe3ac9668e3326 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sat, 11 Nov 2017 15:23:42 +0100 Subject: [PATCH 123/229] allow normalized env name for asset location. fix #702 --- common/platform/platform.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/common/platform/platform.go b/common/platform/platform.go index 3667992a..6e41897c 100644 --- a/common/platform/platform.go +++ b/common/platform/platform.go @@ -46,7 +46,8 @@ func NormalizeEnvName(name string) string { } func GetAssetLocation(file string) string { - assetPath := EnvFlag{Name: "v2ray.location.asset"}.GetValue(func() string { + const name = "v2ray.location.asset" + assetPath := EnvFlag{Name: name, AltName: NormalizeEnvName(name)}.GetValue(func() string { exec, err := os.Executable() if err != nil { return "" From 268d7264e804d4e819d4040b25cd02b29fecc3ac Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sat, 11 Nov 2017 22:29:00 +0100 Subject: [PATCH 124/229] use external config converter first, and then fallback to the internal one --- common/platform/others.go | 7 +++++++ common/platform/platform.go | 16 +++++++------- common/platform/windows.go | 8 +++++++ main/config_json.go | 42 ++++++++++++++++++++++++++++++++++--- 4 files changed, 63 insertions(+), 10 deletions(-) diff --git a/common/platform/others.go b/common/platform/others.go index 0bd7ee77..e93f5af6 100644 --- a/common/platform/others.go +++ b/common/platform/others.go @@ -4,6 +4,7 @@ package platform import ( "os" + "path/filepath" ) func ExpandEnv(s string) string { @@ -13,3 +14,9 @@ func ExpandEnv(s string) string { func LineSeparator() string { return "\n" } + +func GetToolLocation(file string) string { + const name = "v2ray.location.tool" + toolPath := EnvFlag{Name: name, AltName: NormalizeEnvName(name)}.GetValue(getExecutableDir) + return filepath.Join(toolPath, file) +} diff --git a/common/platform/platform.go b/common/platform/platform.go index 6e41897c..fe9acdc7 100644 --- a/common/platform/platform.go +++ b/common/platform/platform.go @@ -45,14 +45,16 @@ func NormalizeEnvName(name string) string { return strings.Replace(strings.ToUpper(strings.TrimSpace(name)), ".", "_", -1) } +func getExecutableDir() string { + exec, err := os.Executable() + if err != nil { + return "" + } + return filepath.Dir(exec) +} + func GetAssetLocation(file string) string { const name = "v2ray.location.asset" - assetPath := EnvFlag{Name: name, AltName: NormalizeEnvName(name)}.GetValue(func() string { - exec, err := os.Executable() - if err != nil { - return "" - } - return filepath.Dir(exec) - }) + assetPath := EnvFlag{Name: name, AltName: NormalizeEnvName(name)}.GetValue(getExecutableDir) return filepath.Join(assetPath, file) } diff --git a/common/platform/windows.go b/common/platform/windows.go index 7fc1f90d..c311ef5c 100644 --- a/common/platform/windows.go +++ b/common/platform/windows.go @@ -2,6 +2,8 @@ package platform +import "path/filepath" + func ExpandEnv(s string) string { // TODO return s @@ -10,3 +12,9 @@ func ExpandEnv(s string) string { func LineSeparator() string { return "\r\n" } + +func GetToolLocation(file string) string { + const name = "v2ray.location.tool" + toolPath := EnvFlag{Name: name, AltName: NormalizeEnvName(name)}.GetValue(getExecutableDir) + return filepath.Join(toolPath, file+".exe") +} diff --git a/main/config_json.go b/main/config_json.go index bf0093df..157dee04 100644 --- a/main/config_json.go +++ b/main/config_json.go @@ -1,5 +1,41 @@ -// +build json - package main -import _ "v2ray.com/core/tools/conf" +import ( + "io" + "os" + "os/exec" + + "v2ray.com/core" + "v2ray.com/core/app/log" + "v2ray.com/core/common/platform" + jsonconf "v2ray.com/ext/tools/conf/serial" +) + +func jsonToProto(input io.Reader) (*core.Config, error) { + v2ctl := platform.GetToolLocation("v2ctl") + _, err := os.Stat(v2ctl) + if err != nil { + return nil, err + } + cmd := exec.Command(v2ctl, "config") + cmd.Stdin = input + cmd.Stderr = os.Stderr + + stdoutReader, err := cmd.StdoutPipe() + if err != nil { + return nil, err + } + defer stdoutReader.Close() + return core.LoadConfig(core.ConfigFormat_Protobuf, stdoutReader) +} + +func init() { + core.RegisterConfigLoader(core.ConfigFormat_JSON, func(input io.Reader) (*core.Config, error) { + config, err := jsonToProto(input) + if err != nil { + log.Trace(newError("failed to execute v2ctl to convert config file.").Base(err).AtWarning()) + return jsonconf.LoadJSONConfig(input) + } + return config, nil + }) +} From a430e2065af178dc0190a316e01f435e1e362ada Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Tue, 14 Nov 2017 23:45:07 +0100 Subject: [PATCH 125/229] move port allocation to udp package --- testing/scenarios/common.go | 12 ------------ testing/scenarios/tls_test.go | 3 ++- testing/scenarios/vmess_test.go | 4 ++-- testing/servers/udp/port.go | 18 ++++++++++++++++++ 4 files changed, 22 insertions(+), 15 deletions(-) create mode 100644 testing/servers/udp/port.go diff --git a/testing/scenarios/common.go b/testing/scenarios/common.go index bdeec7a8..ed9d9e04 100644 --- a/testing/scenarios/common.go +++ b/testing/scenarios/common.go @@ -29,18 +29,6 @@ func pickPort() net.Port { return net.Port(addr.Port) } -func pickUDPPort() net.Port { - conn, err := net.ListenUDP("udp4", &net.UDPAddr{ - IP: net.LocalHostIP.IP(), - Port: 0, - }) - common.Must(err) - defer conn.Close() - - addr := conn.LocalAddr().(*net.UDPAddr) - return net.Port(addr.Port) -} - func xor(b []byte) []byte { r := make([]byte, len(b)) for i, v := range b { diff --git a/testing/scenarios/tls_test.go b/testing/scenarios/tls_test.go index 9186cfd5..76987d7a 100644 --- a/testing/scenarios/tls_test.go +++ b/testing/scenarios/tls_test.go @@ -17,6 +17,7 @@ import ( "v2ray.com/core/proxy/vmess/inbound" "v2ray.com/core/proxy/vmess/outbound" "v2ray.com/core/testing/servers/tcp" + "v2ray.com/core/testing/servers/udp" tlsgen "v2ray.com/core/testing/tls" "v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet/tls" @@ -149,7 +150,7 @@ func TestTLSOverKCP(t *testing.T) { defer tcpServer.Close() userID := protocol.NewID(uuid.New()) - serverPort := pickUDPPort() + serverPort := udp.PickPort() serverConfig := &core.Config{ Inbound: []*proxyman.InboundHandlerConfig{ { diff --git a/testing/scenarios/vmess_test.go b/testing/scenarios/vmess_test.go index 04b04356..067d14d5 100644 --- a/testing/scenarios/vmess_test.go +++ b/testing/scenarios/vmess_test.go @@ -674,7 +674,7 @@ func TestVMessKCP(t *testing.T) { defer tcpServer.Close() userID := protocol.NewID(uuid.New()) - serverPort := pickUDPPort() + serverPort := udp.PickPort() serverConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ @@ -1098,7 +1098,7 @@ func TestVMessGCMMuxUDP(t *testing.T) { } clientPort := pickPort() - clientUDPPort := pickUDPPort() + clientUDPPort := udp.PickPort() clientConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ diff --git a/testing/servers/udp/port.go b/testing/servers/udp/port.go new file mode 100644 index 00000000..0c77c4cf --- /dev/null +++ b/testing/servers/udp/port.go @@ -0,0 +1,18 @@ +package udp + +import ( + "v2ray.com/core/common" + "v2ray.com/core/common/net" +) + +func PickPort() net.Port { + conn, err := net.ListenUDP("udp4", &net.UDPAddr{ + IP: net.LocalHostIP.IP(), + Port: 0, + }) + common.Must(err) + defer conn.Close() + + addr := conn.LocalAddr().(*net.UDPAddr) + return net.Port(addr.Port) +} From 0dbfb6612664475039b44d3540d46c54be0ac9b9 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Wed, 15 Nov 2017 00:36:14 +0100 Subject: [PATCH 126/229] clean up dns package --- app/dns/server/nameserver.go | 30 ++++---- app/dns/server/querier.go | 20 ------ app/dns/server/server.go | 46 ++++++++---- app/dns/server/server_test.go | 102 +++++++++++++++++++++++++++ common/signal/timer.go | 5 +- common/signal/timer_test.go | 6 +- proxy/dokodemo/dokodemo.go | 4 +- proxy/freedom/freedom.go | 3 +- proxy/http/server.go | 3 +- proxy/shadowsocks/client.go | 3 +- proxy/shadowsocks/server.go | 3 +- proxy/socks/client.go | 3 +- proxy/socks/server.go | 3 +- proxy/vmess/inbound/inbound.go | 3 +- proxy/vmess/outbound/outbound.go | 3 +- transport/internet/udp/dispatcher.go | 67 +++++++++++++----- 16 files changed, 225 insertions(+), 79 deletions(-) delete mode 100644 app/dns/server/querier.go create mode 100644 app/dns/server/server_test.go diff --git a/app/dns/server/nameserver.go b/app/dns/server/nameserver.go index 2dc7bb22..c1c3e5ac 100644 --- a/app/dns/server/nameserver.go +++ b/app/dns/server/nameserver.go @@ -2,12 +2,14 @@ package server import ( "context" + "fmt" "sync" "time" "github.com/miekg/dns" "v2ray.com/core/app/dispatcher" "v2ray.com/core/app/log" + "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/dice" "v2ray.com/core/common/net" @@ -15,7 +17,6 @@ import ( ) const ( - DefaultTTL = uint32(3600) CleanupInterval = time.Second * 120 CleanupThreshold = 512 ) @@ -55,7 +56,6 @@ func NewUDPNameServer(address net.Destination, dispatcher dispatcher.Interface) return s } -// Private: Visible for testing. func (v *UDPNameServer) Cleanup() { expiredRequests := make([]uint16, 0, 16) now := time.Now() @@ -70,10 +70,8 @@ func (v *UDPNameServer) Cleanup() { delete(v.requests, id) } v.Unlock() - expiredRequests = nil } -// Private: Visible for testing. func (v *UDPNameServer) AssignUnusedID(response chan<- *ARecord) uint16 { var id uint16 v.Lock() @@ -98,7 +96,6 @@ func (v *UDPNameServer) AssignUnusedID(response chan<- *ARecord) uint16 { return id } -// Private: Visible for testing. func (v *UDPNameServer) HandleResponse(payload *buf.Buffer) { msg := new(dns.Msg) err := msg.Unpack(payload.Bytes()) @@ -110,8 +107,8 @@ func (v *UDPNameServer) HandleResponse(payload *buf.Buffer) { IPs: make([]net.IP, 0, 16), } id := msg.Id - ttl := DefaultTTL - log.Trace(newError("handling response for id ", id, " content: ", msg.String()).AtDebug()) + ttl := uint32(3600) // an hour + log.Trace(newError("handling response for id ", id, " content: ", msg).AtDebug()) v.Lock() request, found := v.requests[id] @@ -126,6 +123,7 @@ func (v *UDPNameServer) HandleResponse(payload *buf.Buffer) { switch rr := rr.(type) { case *dns.A: record.IPs = append(record.IPs, rr.A) + fmt.Println("Adding ans:", rr.A) if rr.Hdr.Ttl < ttl { ttl = rr.Hdr.Ttl } @@ -152,13 +150,18 @@ func (v *UDPNameServer) BuildQueryA(domain string, id uint16) *buf.Buffer { Name: dns.Fqdn(domain), Qtype: dns.TypeA, Qclass: dns.ClassINET, + }, + { + Name: dns.Fqdn(domain), + Qtype: dns.TypeAAAA, + Qclass: dns.ClassINET, }} buffer := buf.New() - buffer.AppendSupplier(func(b []byte) (int, error) { + common.Must(buffer.Reset(func(b []byte) (int, error) { writtenBuffer, err := msg.PackBuffer(b) return len(writtenBuffer), err - }) + })) return buffer } @@ -167,7 +170,7 @@ func (v *UDPNameServer) QueryA(domain string) <-chan *ARecord { response := make(chan *ARecord, 1) id := v.AssignUnusedID(response) - ctx, cancel := context.WithTimeout(context.Background(), time.Second*8) + ctx, cancel := context.WithCancel(context.Background()) v.udpServer.Dispatch(ctx, v.address, v.BuildQueryA(domain, id), v.HandleResponse) go func() { @@ -176,11 +179,10 @@ func (v *UDPNameServer) QueryA(domain string) <-chan *ARecord { v.Lock() _, found := v.requests[id] v.Unlock() - if found { - v.udpServer.Dispatch(ctx, v.address, v.BuildQueryA(domain, id), v.HandleResponse) - } else { + if !found { break } + v.udpServer.Dispatch(ctx, v.address, v.BuildQueryA(domain, id), v.HandleResponse) } cancel() }() @@ -205,7 +207,7 @@ func (v *LocalNameServer) QueryA(domain string) <-chan *ARecord { response <- &ARecord{ IPs: ips, - Expire: time.Now().Add(time.Second * time.Duration(DefaultTTL)), + Expire: time.Now().Add(time.Hour), } }() diff --git a/app/dns/server/querier.go b/app/dns/server/querier.go deleted file mode 100644 index 722c8163..00000000 --- a/app/dns/server/querier.go +++ /dev/null @@ -1,20 +0,0 @@ -package server - -import ( - "time" - - "v2ray.com/core/common/net" -) - -type IPResult struct { - IP []net.IP - TTL time.Duration -} - -type Querier interface { - QueryDomain(domain string) <-chan *IPResult -} - -type UDPQuerier struct { - server net.Destination -} diff --git a/app/dns/server/server.go b/app/dns/server/server.go index 567cf457..fd6987cb 100644 --- a/app/dns/server/server.go +++ b/app/dns/server/server.go @@ -21,22 +21,22 @@ const ( ) type DomainRecord struct { - A *ARecord -} - -type Record struct { IP []net.IP Expire time.Time LastAccess time.Time } -func (r *Record) Expired() bool { +func (r *DomainRecord) Expired() bool { + return r.Expire.Before(time.Now()) +} + +func (r *DomainRecord) Inactive() bool { now := time.Now() - return r.Expire.Before(now) || r.LastAccess.Add(time.Hour).Before(now) + return r.Expire.Before(now) || r.LastAccess.Add(time.Minute*5).Before(now) } type CacheServer struct { - sync.RWMutex + sync.Mutex hosts map[string]net.IP records map[string]*DomainRecord servers []NameServer @@ -90,15 +90,33 @@ func (*CacheServer) Start() error { func (*CacheServer) Close() {} func (s *CacheServer) GetCached(domain string) []net.IP { - s.RLock() - defer s.RUnlock() + s.Lock() + defer s.Unlock() - if record, found := s.records[domain]; found && record.A.Expire.After(time.Now()) { - return record.A.IPs + if record, found := s.records[domain]; found && !record.Expired() { + record.LastAccess = time.Now() + return record.IP } return nil } +func (s *CacheServer) tryCleanup() { + s.Lock() + defer s.Unlock() + + if len(s.records) > 256 { + domains := make([]string, 0, 256) + for d, r := range s.records { + if r.Expired() { + domains = append(domains, d) + } + } + for _, d := range domains { + delete(s.records, d) + } + } +} + func (s *CacheServer) Get(domain string) []net.IP { if ip, found := s.hosts[domain]; found { return []net.IP{ip} @@ -110,6 +128,8 @@ func (s *CacheServer) Get(domain string) []net.IP { return ips } + s.tryCleanup() + for _, server := range s.servers { response := server.QueryA(domain) select { @@ -119,7 +139,9 @@ func (s *CacheServer) Get(domain string) []net.IP { } s.Lock() s.records[domain] = &DomainRecord{ - A: a, + IP: a.IPs, + Expire: a.Expire, + LastAccess: time.Now(), } s.Unlock() log.Trace(newError("returning ", len(a.IPs), " IPs for domain ", domain).AtDebug()) diff --git a/app/dns/server/server_test.go b/app/dns/server/server_test.go new file mode 100644 index 00000000..8a30b361 --- /dev/null +++ b/app/dns/server/server_test.go @@ -0,0 +1,102 @@ +package server_test + +import ( + "context" + "testing" + + "v2ray.com/core/app" + "v2ray.com/core/app/dispatcher" + _ "v2ray.com/core/app/dispatcher/impl" + . "v2ray.com/core/app/dns" + _ "v2ray.com/core/app/dns/server" + "v2ray.com/core/app/proxyman" + _ "v2ray.com/core/app/proxyman/outbound" + "v2ray.com/core/common" + "v2ray.com/core/common/net" + "v2ray.com/core/common/serial" + "v2ray.com/core/proxy/freedom" + "v2ray.com/core/testing/servers/udp" + . "v2ray.com/ext/assert" + + "github.com/miekg/dns" +) + +type staticHandler struct { +} + +func (*staticHandler) ServeDNS(w dns.ResponseWriter, r *dns.Msg) { + ans := new(dns.Msg) + ans.Id = r.Id + for _, q := range r.Question { + if q.Name == "google.com." && q.Qtype == dns.TypeA { + rr, _ := dns.NewRR("google.com. IN A 8.8.8.8") + ans.Answer = append(ans.Answer, rr) + } else if q.Name == "facebook.com." && q.Qtype == dns.TypeA { + rr, _ := dns.NewRR("facebook.com. IN A 9.9.9.9") + ans.Answer = append(ans.Answer, rr) + } + } + w.WriteMsg(ans) +} + +func TestUDPServer(t *testing.T) { + assert := With(t) + + port := udp.PickPort() + + dnsServer := dns.Server{ + Addr: "127.0.0.1:" + port.String(), + Net: "udp", + Handler: &staticHandler{}, + UDPSize: 1200, + } + + go dnsServer.ListenAndServe() + + config := &Config{ + NameServers: []*net.Endpoint{ + { + Network: net.Network_UDP, + Address: &net.IPOrDomain{ + Address: &net.IPOrDomain_Ip{ + Ip: []byte{127, 0, 0, 1}, + }, + }, + Port: uint32(port), + }, + }, + } + + ctx := context.Background() + space := app.NewSpace() + + ctx = app.ContextWithSpace(ctx, space) + common.Must(app.AddApplicationToSpace(ctx, config)) + common.Must(app.AddApplicationToSpace(ctx, &dispatcher.Config{})) + common.Must(app.AddApplicationToSpace(ctx, &proxyman.OutboundConfig{})) + + om := proxyman.OutboundHandlerManagerFromSpace(space) + om.AddHandler(ctx, &proxyman.OutboundHandlerConfig{ + ProxySettings: serial.ToTypedMessage(&freedom.Config{}), + }) + + common.Must(space.Initialize()) + common.Must(space.Start()) + + server := FromSpace(space) + assert(server, IsNotNil) + + ips := server.Get("google.com") + assert(len(ips), Equals, 1) + assert([]byte(ips[0]), Equals, []byte{8, 8, 8, 8}) + + ips = server.Get("facebook.com") + assert(len(ips), Equals, 1) + assert([]byte(ips[0]), Equals, []byte{9, 9, 9, 9}) + + dnsServer.Shutdown() + + ips = server.Get("google.com") + assert(len(ips), Equals, 1) + assert([]byte(ips[0]), Equals, []byte{8, 8, 8, 8}) +} diff --git a/common/signal/timer.go b/common/signal/timer.go index 21837027..5c2407f7 100644 --- a/common/signal/timer.go +++ b/common/signal/timer.go @@ -53,8 +53,7 @@ func (t *ActivityTimer) run() { } } -func CancelAfterInactivity(ctx context.Context, timeout time.Duration) (context.Context, *ActivityTimer) { - ctx, cancel := context.WithCancel(ctx) +func CancelAfterInactivity(ctx context.Context, cancel context.CancelFunc, timeout time.Duration) *ActivityTimer { timer := &ActivityTimer{ ctx: ctx, cancel: cancel, @@ -63,5 +62,5 @@ func CancelAfterInactivity(ctx context.Context, timeout time.Duration) (context. } timer.timeout <- timeout go timer.run() - return ctx, timer + return timer } diff --git a/common/signal/timer_test.go b/common/signal/timer_test.go index abaa9f6a..a34cfbc1 100644 --- a/common/signal/timer_test.go +++ b/common/signal/timer_test.go @@ -13,7 +13,8 @@ import ( func TestActivityTimer(t *testing.T) { assert := With(t) - ctx, timer := CancelAfterInactivity(context.Background(), time.Second*5) + ctx, cancel := context.WithCancel(context.Background()) + timer := CancelAfterInactivity(ctx, cancel, time.Second*5) time.Sleep(time.Second * 6) assert(ctx.Err(), IsNotNil) runtime.KeepAlive(timer) @@ -22,7 +23,8 @@ func TestActivityTimer(t *testing.T) { func TestActivityTimerUpdate(t *testing.T) { assert := With(t) - ctx, timer := CancelAfterInactivity(context.Background(), time.Second*10) + ctx, cancel := context.WithCancel(context.Background()) + timer := CancelAfterInactivity(ctx, cancel, time.Second*10) time.Sleep(time.Second * 3) assert(ctx.Err(), IsNil) timer.SetTimeout(time.Second * 1) diff --git a/proxy/dokodemo/dokodemo.go b/proxy/dokodemo/dokodemo.go index 62a31395..a62a21bd 100644 --- a/proxy/dokodemo/dokodemo.go +++ b/proxy/dokodemo/dokodemo.go @@ -64,7 +64,9 @@ func (d *DokodemoDoor) Process(ctx context.Context, network net.Network, conn in if timeout == 0 { timeout = time.Minute * 5 } - ctx, timer := signal.CancelAfterInactivity(ctx, timeout) + + ctx, cancel := context.WithCancel(ctx) + timer := signal.CancelAfterInactivity(ctx, cancel, timeout) inboundRay, err := dispatcher.Dispatch(ctx, dest) if err != nil { diff --git a/proxy/freedom/freedom.go b/proxy/freedom/freedom.go index bc5644c7..ea28a8d1 100644 --- a/proxy/freedom/freedom.go +++ b/proxy/freedom/freedom.go @@ -107,7 +107,8 @@ func (v *Handler) Process(ctx context.Context, outboundRay ray.OutboundRay, dial if timeout == 0 { timeout = time.Minute * 5 } - ctx, timer := signal.CancelAfterInactivity(ctx, timeout) + ctx, cancel := context.WithCancel(ctx) + timer := signal.CancelAfterInactivity(ctx, cancel, timeout) requestDone := signal.ExecuteAsync(func() error { var writer buf.Writer diff --git a/proxy/http/server.go b/proxy/http/server.go index 484389dd..4a09ad49 100644 --- a/proxy/http/server.go +++ b/proxy/http/server.go @@ -153,7 +153,8 @@ func (s *Server) handleConnect(ctx context.Context, request *http.Request, reade if timeout == 0 { timeout = time.Minute * 5 } - ctx, timer := signal.CancelAfterInactivity(ctx, timeout) + ctx, cancel := context.WithCancel(ctx) + timer := signal.CancelAfterInactivity(ctx, cancel, timeout) ray, err := dispatcher.Dispatch(ctx, dest) if err != nil { return err diff --git a/proxy/shadowsocks/client.go b/proxy/shadowsocks/client.go index 04581357..a61b6afb 100644 --- a/proxy/shadowsocks/client.go +++ b/proxy/shadowsocks/client.go @@ -90,7 +90,8 @@ func (v *Client) Process(ctx context.Context, outboundRay ray.OutboundRay, diale request.Option |= RequestOptionOneTimeAuth } - ctx, timer := signal.CancelAfterInactivity(ctx, time.Minute*5) + ctx, cancel := context.WithCancel(ctx) + timer := signal.CancelAfterInactivity(ctx, cancel, time.Minute*5) if request.Command == protocol.RequestCommandTCP { bufferedWriter := buf.NewBufferedWriter(buf.NewWriter(conn)) diff --git a/proxy/shadowsocks/server.go b/proxy/shadowsocks/server.go index 0e52ed3b..9feeb337 100644 --- a/proxy/shadowsocks/server.go +++ b/proxy/shadowsocks/server.go @@ -146,7 +146,8 @@ func (s *Server) handleConnection(ctx context.Context, conn internet.Connection, ctx = protocol.ContextWithUser(ctx, request.User) userSettings := s.user.GetSettings() - ctx, timer := signal.CancelAfterInactivity(ctx, userSettings.PayloadTimeout) + ctx, cancel := context.WithCancel(ctx) + timer := signal.CancelAfterInactivity(ctx, cancel, userSettings.PayloadTimeout) ray, err := dispatcher.Dispatch(ctx, dest) if err != nil { return err diff --git a/proxy/socks/client.go b/proxy/socks/client.go index 49226273..ea97b836 100644 --- a/proxy/socks/client.go +++ b/proxy/socks/client.go @@ -83,7 +83,8 @@ func (c *Client) Process(ctx context.Context, ray ray.OutboundRay, dialer proxy. return newError("failed to establish connection to server").AtWarning().Base(err) } - ctx, timer := signal.CancelAfterInactivity(ctx, time.Minute*5) + ctx, cancel := context.WithCancel(ctx) + timer := signal.CancelAfterInactivity(ctx, cancel, time.Minute*5) var requestFunc func() error var responseFunc func() error diff --git a/proxy/socks/server.go b/proxy/socks/server.go index ec3d74e2..95debeb7 100644 --- a/proxy/socks/server.go +++ b/proxy/socks/server.go @@ -107,7 +107,8 @@ func (v *Server) transport(ctx context.Context, reader io.Reader, writer io.Writ if timeout == 0 { timeout = time.Minute * 5 } - ctx, timer := signal.CancelAfterInactivity(ctx, timeout) + ctx, cancel := context.WithCancel(ctx) + timer := signal.CancelAfterInactivity(ctx, cancel, timeout) ray, err := dispatcher.Dispatch(ctx, dest) if err != nil { diff --git a/proxy/vmess/inbound/inbound.go b/proxy/vmess/inbound/inbound.go index 46b5a6b3..36439c98 100644 --- a/proxy/vmess/inbound/inbound.go +++ b/proxy/vmess/inbound/inbound.go @@ -204,7 +204,8 @@ func (v *Handler) Process(ctx context.Context, network net.Network, connection i ctx = protocol.ContextWithUser(ctx, request.User) - ctx, timer := signal.CancelAfterInactivity(ctx, userSettings.PayloadTimeout) + ctx, cancel := context.WithCancel(ctx) + timer := signal.CancelAfterInactivity(ctx, cancel, userSettings.PayloadTimeout) ray, err := dispatcher.Dispatch(ctx, request.Destination()) if err != nil { return newError("failed to dispatch request to ", request.Destination()).Base(err) diff --git a/proxy/vmess/outbound/outbound.go b/proxy/vmess/outbound/outbound.go index aac6094d..0f538f06 100644 --- a/proxy/vmess/outbound/outbound.go +++ b/proxy/vmess/outbound/outbound.go @@ -103,7 +103,8 @@ func (v *Handler) Process(ctx context.Context, outboundRay ray.OutboundRay, dial session := encoding.NewClientSession(protocol.DefaultIDHash) - ctx, timer := signal.CancelAfterInactivity(ctx, time.Minute*5) + ctx, cancel := context.WithCancel(ctx) + timer := signal.CancelAfterInactivity(ctx, cancel, time.Minute*5) requestDone := signal.ExecuteAsync(func() error { writer := buf.NewBufferedWriter(buf.NewWriter(conn)) diff --git a/transport/internet/udp/dispatcher.go b/transport/internet/udp/dispatcher.go index 8b116614..9867d03f 100644 --- a/transport/internet/udp/dispatcher.go +++ b/transport/internet/udp/dispatcher.go @@ -3,25 +3,33 @@ package udp import ( "context" "sync" + "time" "v2ray.com/core/app/dispatcher" "v2ray.com/core/app/log" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" + "v2ray.com/core/common/signal" "v2ray.com/core/transport/ray" ) type ResponseCallback func(payload *buf.Buffer) +type connEntry struct { + inbound ray.InboundRay + timer signal.ActivityUpdater + cancel context.CancelFunc +} + type Dispatcher struct { sync.RWMutex - conns map[net.Destination]ray.InboundRay + conns map[net.Destination]*connEntry dispatcher dispatcher.Interface } func NewDispatcher(dispatcher dispatcher.Interface) *Dispatcher { return &Dispatcher{ - conns: make(map[net.Destination]ray.InboundRay), + conns: make(map[net.Destination]*connEntry), dispatcher: dispatcher, } } @@ -30,51 +38,72 @@ func (v *Dispatcher) RemoveRay(dest net.Destination) { v.Lock() defer v.Unlock() if conn, found := v.conns[dest]; found { - conn.InboundInput().Close() - conn.InboundOutput().Close() + conn.inbound.InboundInput().Close() + conn.inbound.InboundOutput().Close() delete(v.conns, dest) } } -func (v *Dispatcher) getInboundRay(ctx context.Context, dest net.Destination) (ray.InboundRay, bool) { +func (v *Dispatcher) getInboundRay(dest net.Destination, callback ResponseCallback) *connEntry { v.Lock() defer v.Unlock() if entry, found := v.conns[dest]; found { - return entry, true + return entry } log.Trace(newError("establishing new connection for ", dest)) + + ctx, cancel := context.WithCancel(context.Background()) + removeRay := func() { + cancel() + v.RemoveRay(dest) + } + timer := signal.CancelAfterInactivity(ctx, removeRay, time.Second*4) inboundRay, _ := v.dispatcher.Dispatch(ctx, dest) - v.conns[dest] = inboundRay - return inboundRay, false + entry := &connEntry{ + inbound: inboundRay, + timer: timer, + cancel: removeRay, + } + v.conns[dest] = entry + go handleInput(ctx, entry, callback) + return entry } func (v *Dispatcher) Dispatch(ctx context.Context, destination net.Destination, payload *buf.Buffer, callback ResponseCallback) { // TODO: Add user to destString log.Trace(newError("dispatch request to: ", destination).AtDebug()) - inboundRay, existing := v.getInboundRay(ctx, destination) - outputStream := inboundRay.InboundInput() + conn := v.getInboundRay(destination, callback) + outputStream := conn.inbound.InboundInput() if outputStream != nil { if err := outputStream.WriteMultiBuffer(buf.NewMultiBufferValue(payload)); err != nil { - v.RemoveRay(destination) + log.Trace(newError("failed to write first UDP payload").Base(err)) + conn.cancel() + return } } - if !existing { - go func() { - handleInput(inboundRay.InboundOutput(), callback) - v.RemoveRay(destination) - }() - } } -func handleInput(input ray.InputStream, callback ResponseCallback) { +func handleInput(ctx context.Context, conn *connEntry, callback ResponseCallback) { + input := conn.inbound.InboundOutput() + timer := conn.timer + for { + select { + case <-ctx.Done(): + return + default: + } + mb, err := input.ReadMultiBuffer() if err != nil { - break + log.Trace(newError("failed to handl UDP input").Base(err)) + conn.cancel() + return } + timer.Update() for _, b := range mb { callback(b) } From 5a6022d1ede87a7c984eee3f8da11e2637f166b8 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Wed, 15 Nov 2017 01:14:02 +0100 Subject: [PATCH 127/229] log err for SetReadDeadline(). fix #707 --- proxy/vmess/inbound/inbound.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/proxy/vmess/inbound/inbound.go b/proxy/vmess/inbound/inbound.go index 36439c98..4e268a66 100644 --- a/proxy/vmess/inbound/inbound.go +++ b/proxy/vmess/inbound/inbound.go @@ -174,7 +174,7 @@ func transferResponse(timer signal.ActivityUpdater, session *encoding.ServerSess // Process implements proxy.Inbound.Process(). func (v *Handler) Process(ctx context.Context, network net.Network, connection internet.Connection, dispatcher dispatcher.Interface) error { if err := connection.SetReadDeadline(time.Now().Add(time.Second * 8)); err != nil { - return err + return newError("unable to set read deadline").Base(err).AtWarning() } reader := buf.NewBufferedReader(buf.NewReader(connection)) @@ -198,7 +198,9 @@ func (v *Handler) Process(ctx context.Context, network net.Network, connection i log.Access(connection.RemoteAddr(), request.Destination(), log.AccessAccepted, "") log.Trace(newError("received request for ", request.Destination())) - common.Must(connection.SetReadDeadline(time.Time{})) + if err := connection.SetReadDeadline(time.Time{}); err != nil { + log.Trace(newError("unable to set back read deadline").Base(err)) + } userSettings := request.User.GetSettings() From f3c5df8798f5d06fae428739e1c881cfd18c3701 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Wed, 15 Nov 2017 11:23:25 +0100 Subject: [PATCH 128/229] make sure writer not buffered --- common/buf/writer.go | 4 +++- proxy/http/server.go | 9 ++------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/common/buf/writer.go b/common/buf/writer.go index 4825db6f..06e037fb 100644 --- a/common/buf/writer.go +++ b/common/buf/writer.go @@ -121,6 +121,7 @@ func (w *BufferedWriter) SetBuffered(f bool) error { return nil } +// ReadFrom implements io.ReaderFrom. func (w *BufferedWriter) ReadFrom(reader io.Reader) (int64, error) { var sc SizeCounter if !w.buffer.IsEmpty() { @@ -130,11 +131,12 @@ func (w *BufferedWriter) ReadFrom(reader io.Reader) (int64, error) { } } + w.buffered = false + if readerFrom, ok := w.writer.(io.ReaderFrom); ok { return readerFrom.ReadFrom(reader) } - w.buffered = false err := Copy(NewReader(reader), w, CountSize(&sc)) return sc.Size, err } diff --git a/proxy/http/server.go b/proxy/http/server.go index 4a09ad49..cfe52429 100644 --- a/proxy/http/server.go +++ b/proxy/http/server.go @@ -257,13 +257,8 @@ func (s *Server) handlePlainHTTP(ctx context.Context, request *http.Request, rea request.Header.Set("Connection", "close") requestWriter := buf.NewBufferedWriter(ray.InboundInput()) - if err := request.Write(requestWriter); err != nil { - return err - } - if err := requestWriter.Flush(); err != nil { - return err - } - return nil + common.Must(requestWriter.SetBuffered(false)) + return request.Write(requestWriter) }) responseDone := signal.ExecuteAsync(func() error { From 26f005e82290e96c73dc0ca9cccbf9f644014140 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Wed, 15 Nov 2017 12:55:47 +0100 Subject: [PATCH 129/229] resolve to ip on demand --- app/router/condition.go | 10 +++-- app/router/config.pb.go | 86 +++++++++++++++++++++-------------------- app/router/config.proto | 3 ++ app/router/router.go | 43 +++++++++++++++++++-- proxy/context.go | 12 ++++-- 5 files changed, 101 insertions(+), 53 deletions(-) diff --git a/app/router/condition.go b/app/router/condition.go index d370f691..40797cfc 100644 --- a/app/router/condition.go +++ b/app/router/condition.go @@ -258,8 +258,9 @@ func NewCIDRMatcher(ip []byte, mask uint32, onSource bool) (*CIDRMatcher, error) func (v *CIDRMatcher) Apply(ctx context.Context) bool { ips := make([]net.IP, 0, 4) - if resolveIPs, ok := proxy.ResolvedIPsFromContext(ctx); ok { - for _, rip := range resolveIPs { + if resolver, ok := proxy.ResolvedIPsFromContext(ctx); ok { + resolvedIPs := resolver.Resolve() + for _, rip := range resolvedIPs { if !rip.Family().IsIPv6() { continue } @@ -301,8 +302,9 @@ func NewIPv4Matcher(ipnet *net.IPNetTable, onSource bool) *IPv4Matcher { func (v *IPv4Matcher) Apply(ctx context.Context) bool { ips := make([]net.IP, 0, 4) - if resolveIPs, ok := proxy.ResolvedIPsFromContext(ctx); ok { - for _, rip := range resolveIPs { + if resolver, ok := proxy.ResolvedIPsFromContext(ctx); ok { + resolvedIPs := resolver.Resolve() + for _, rip := range resolvedIPs { if !rip.Family().IsIPv4() { continue } diff --git a/app/router/config.pb.go b/app/router/config.pb.go index e31bd617..d43c5700 100644 --- a/app/router/config.pb.go +++ b/app/router/config.pb.go @@ -54,17 +54,21 @@ const ( Config_UseIp Config_DomainStrategy = 1 // Resolve to IP if the domain doesn't match any rules. Config_IpIfNonMatch Config_DomainStrategy = 2 + // Resolve to IP if any rule requires IP matching. + Config_IpOnDemand Config_DomainStrategy = 3 ) var Config_DomainStrategy_name = map[int32]string{ 0: "AsIs", 1: "UseIp", 2: "IpIfNonMatch", + 3: "IpOnDemand", } var Config_DomainStrategy_value = map[string]int32{ "AsIs": 0, "UseIp": 1, "IpIfNonMatch": 2, + "IpOnDemand": 3, } func (x Config_DomainStrategy) String() string { @@ -318,45 +322,45 @@ func init() { func init() { proto.RegisterFile("v2ray.com/core/app/router/config.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 626 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x94, 0xdf, 0x6e, 0xd3, 0x30, - 0x14, 0xc6, 0x49, 0xda, 0x66, 0xcb, 0x49, 0x29, 0x91, 0xc5, 0x50, 0x18, 0x0c, 0x4a, 0x84, 0xa0, - 0x17, 0x28, 0x91, 0xca, 0xbf, 0x1b, 0xd0, 0x34, 0xba, 0x69, 0xaa, 0x04, 0x53, 0xe5, 0x6d, 0x5c, - 0xc0, 0x45, 0x94, 0xa5, 0x5e, 0x88, 0x68, 0x6d, 0xcb, 0x71, 0xc6, 0x7a, 0xc7, 0x0b, 0xf0, 0x22, - 0x3c, 0x0d, 0x8f, 0x84, 0x6c, 0xa7, 0xb0, 0xa2, 0x05, 0x26, 0xee, 0x6c, 0xe7, 0xf7, 0x9d, 0xf3, - 0xe5, 0xf8, 0x1c, 0xc3, 0xa3, 0xb3, 0xa1, 0x48, 0x17, 0x51, 0xc6, 0xe6, 0x71, 0xc6, 0x04, 0x89, - 0x53, 0xce, 0x63, 0xc1, 0x2a, 0x49, 0x44, 0x9c, 0x31, 0x7a, 0x5a, 0xe4, 0x11, 0x17, 0x4c, 0x32, - 0xb4, 0xb1, 0xe4, 0x04, 0x89, 0x52, 0xce, 0x23, 0xc3, 0x6c, 0x3e, 0xfc, 0x43, 0x9e, 0xb1, 0xf9, - 0x9c, 0xd1, 0x98, 0x12, 0x19, 0x73, 0x26, 0xa4, 0x11, 0x6f, 0x3e, 0x6e, 0xa6, 0x28, 0x91, 0x5f, - 0x98, 0xf8, 0x6c, 0xc0, 0xf0, 0xab, 0x05, 0xce, 0x2e, 0x9b, 0xa7, 0x05, 0x45, 0x2f, 0xa0, 0x2d, - 0x17, 0x9c, 0x04, 0x56, 0xdf, 0x1a, 0xf4, 0x86, 0x61, 0x74, 0x69, 0xfe, 0xc8, 0xc0, 0xd1, 0xd1, - 0x82, 0x13, 0xac, 0x79, 0x74, 0x13, 0x3a, 0x67, 0xe9, 0xac, 0x22, 0x81, 0xdd, 0xb7, 0x06, 0x2e, - 0x36, 0x9b, 0x70, 0x00, 0x6d, 0xc5, 0x20, 0x17, 0x3a, 0x93, 0x59, 0x5a, 0x50, 0xff, 0x9a, 0x5a, - 0x62, 0x92, 0x93, 0x73, 0xdf, 0x42, 0xb0, 0xcc, 0xea, 0xdb, 0x61, 0x04, 0xed, 0xd1, 0x78, 0x17, - 0xa3, 0x1e, 0xd8, 0x05, 0xd7, 0xd9, 0xbb, 0xd8, 0x2e, 0x38, 0xba, 0x05, 0x0e, 0x17, 0xe4, 0xb4, - 0x38, 0xd7, 0x81, 0xaf, 0xe3, 0x7a, 0x17, 0x7e, 0x84, 0xce, 0x3e, 0x61, 0xe3, 0x09, 0x7a, 0x00, - 0xdd, 0x8c, 0x55, 0x54, 0x8a, 0x45, 0x92, 0xb1, 0xa9, 0x31, 0xee, 0x62, 0xaf, 0x3e, 0x1b, 0xb1, - 0x29, 0x41, 0x31, 0xb4, 0xb3, 0x62, 0x2a, 0x02, 0xbb, 0xdf, 0x1a, 0x78, 0xc3, 0x3b, 0x0d, 0xff, - 0xa4, 0xd2, 0x63, 0x0d, 0x86, 0xdb, 0xe0, 0xea, 0xe0, 0x6f, 0x8b, 0x52, 0xa2, 0x21, 0x74, 0x88, - 0x0a, 0x15, 0x58, 0x5a, 0x7e, 0xb7, 0x41, 0xae, 0x05, 0xd8, 0xa0, 0x61, 0x06, 0x6b, 0xfb, 0x84, - 0x1d, 0x16, 0x92, 0x5c, 0xc5, 0xdf, 0x73, 0x70, 0xa6, 0xba, 0x0e, 0xb5, 0xc3, 0xad, 0xbf, 0x56, - 0x1d, 0xd7, 0x70, 0x38, 0x02, 0xaf, 0x4e, 0xa2, 0x7d, 0x3e, 0x5b, 0xf5, 0x79, 0xaf, 0xd9, 0xa7, - 0x92, 0x2c, 0x9d, 0x7e, 0x6b, 0x81, 0x87, 0x59, 0x25, 0x0b, 0x9a, 0xe3, 0x6a, 0x46, 0x90, 0x0f, - 0x2d, 0x99, 0xe6, 0xb5, 0x4b, 0xb5, 0xfc, 0x4f, 0x77, 0xbf, 0x8a, 0xde, 0xba, 0x62, 0xd1, 0xd1, - 0x36, 0x80, 0xea, 0xdd, 0x44, 0xa4, 0x34, 0x27, 0x41, 0xbb, 0x6f, 0x0d, 0xbc, 0x61, 0xff, 0xa2, - 0xcc, 0xb4, 0x6f, 0x44, 0x89, 0x8c, 0x26, 0x4c, 0x48, 0xac, 0x38, 0xec, 0xf2, 0xe5, 0x12, 0xed, - 0x41, 0xb7, 0x6e, 0xeb, 0x64, 0x56, 0x94, 0x32, 0xe8, 0xe8, 0x10, 0x61, 0x43, 0x88, 0x03, 0x83, - 0xaa, 0xd2, 0x61, 0x8f, 0xfe, 0xde, 0xa0, 0x57, 0xe0, 0x95, 0xac, 0x12, 0x19, 0x49, 0xb4, 0x7f, - 0xe7, 0xdf, 0xfe, 0xc1, 0xf0, 0x23, 0xf5, 0x17, 0x5b, 0x00, 0x55, 0x49, 0x44, 0x42, 0xe6, 0x69, - 0x31, 0x0b, 0xd6, 0xfa, 0xad, 0x81, 0x8b, 0x5d, 0x75, 0xb2, 0xa7, 0x0e, 0xd0, 0x7d, 0xf0, 0x0a, - 0x7a, 0xc2, 0x2a, 0x3a, 0x4d, 0x54, 0x99, 0xd7, 0xf5, 0x77, 0xa8, 0x8f, 0x8e, 0xd2, 0x3c, 0xfc, - 0x61, 0x81, 0x33, 0xd2, 0x2f, 0x00, 0x3a, 0x86, 0x1b, 0xa6, 0x96, 0x49, 0x29, 0x45, 0x2a, 0x49, - 0xbe, 0xa8, 0xa7, 0xf2, 0x49, 0x93, 0x19, 0xf3, 0x72, 0x98, 0x8b, 0x38, 0xac, 0x35, 0xb8, 0x37, - 0x5d, 0xd9, 0xab, 0x09, 0x17, 0xd5, 0x8c, 0xd4, 0xb7, 0xd9, 0x34, 0xe1, 0x17, 0x7a, 0x02, 0x6b, - 0x3e, 0x7c, 0x09, 0xbd, 0xd5, 0xc8, 0x68, 0x1d, 0xda, 0x3b, 0xe5, 0xb8, 0x34, 0x43, 0x7d, 0x5c, - 0x92, 0x31, 0xf7, 0x2d, 0xe4, 0x43, 0x77, 0xcc, 0xc7, 0xa7, 0x07, 0x8c, 0xbe, 0x4b, 0x65, 0xf6, - 0xc9, 0xb7, 0xdf, 0xbc, 0x86, 0xdb, 0x19, 0x9b, 0x5f, 0x9e, 0x67, 0x62, 0x7d, 0x70, 0xcc, 0xea, - 0xbb, 0xbd, 0xf1, 0x7e, 0x88, 0xd3, 0x45, 0x34, 0x52, 0xc4, 0x0e, 0xe7, 0xda, 0x02, 0x11, 0x27, - 0x8e, 0x7e, 0xa3, 0x9e, 0xfe, 0x0c, 0x00, 0x00, 0xff, 0xff, 0x6d, 0xa3, 0xd9, 0xd0, 0x33, 0x05, - 0x00, 0x00, + // 640 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x94, 0xcd, 0x6e, 0xd4, 0x3a, + 0x14, 0xc7, 0x6f, 0xe6, 0xab, 0x9d, 0x93, 0xb9, 0x73, 0x23, 0xeb, 0x16, 0x0d, 0x85, 0xc2, 0x10, + 0x21, 0x98, 0x05, 0x4a, 0xa4, 0xe1, 0x63, 0x05, 0xaa, 0xca, 0xb4, 0xaa, 0x22, 0x41, 0x19, 0xb9, + 0x2d, 0x0b, 0x58, 0x44, 0x6e, 0xe2, 0x86, 0x88, 0x89, 0x6d, 0x39, 0x4e, 0xe9, 0xec, 0x78, 0x01, + 0x5e, 0x84, 0xa7, 0xe2, 0x51, 0x90, 0xed, 0x0c, 0xb4, 0xa8, 0x81, 0x8a, 0x9d, 0xed, 0xfc, 0xfe, + 0xe7, 0xfc, 0x73, 0x7c, 0x8e, 0xe1, 0xc1, 0xd9, 0x54, 0x92, 0x65, 0x90, 0xf0, 0x22, 0x4c, 0xb8, + 0xa4, 0x21, 0x11, 0x22, 0x94, 0xbc, 0x52, 0x54, 0x86, 0x09, 0x67, 0xa7, 0x79, 0x16, 0x08, 0xc9, + 0x15, 0x47, 0x1b, 0x2b, 0x4e, 0xd2, 0x80, 0x08, 0x11, 0x58, 0x66, 0xf3, 0xfe, 0x2f, 0xf2, 0x84, + 0x17, 0x05, 0x67, 0x21, 0xa3, 0x2a, 0x14, 0x5c, 0x2a, 0x2b, 0xde, 0x7c, 0xd8, 0x4c, 0x31, 0xaa, + 0x3e, 0x71, 0xf9, 0xd1, 0x82, 0xfe, 0x67, 0x07, 0x7a, 0xbb, 0xbc, 0x20, 0x39, 0x43, 0xcf, 0xa0, + 0xa3, 0x96, 0x82, 0x8e, 0x9c, 0xb1, 0x33, 0x19, 0x4e, 0xfd, 0xe0, 0xca, 0xfc, 0x81, 0x85, 0x83, + 0xa3, 0xa5, 0xa0, 0xd8, 0xf0, 0xe8, 0x7f, 0xe8, 0x9e, 0x91, 0x45, 0x45, 0x47, 0xad, 0xb1, 0x33, + 0xe9, 0x63, 0xbb, 0xf1, 0x27, 0xd0, 0xd1, 0x0c, 0xea, 0x43, 0x77, 0xbe, 0x20, 0x39, 0xf3, 0xfe, + 0xd1, 0x4b, 0x4c, 0x33, 0x7a, 0xee, 0x39, 0x08, 0x56, 0x59, 0xbd, 0x96, 0x1f, 0x40, 0x67, 0x16, + 0xed, 0x62, 0x34, 0x84, 0x56, 0x2e, 0x4c, 0xf6, 0x01, 0x6e, 0xe5, 0x02, 0xdd, 0x80, 0x9e, 0x90, + 0xf4, 0x34, 0x3f, 0x37, 0x81, 0xff, 0xc5, 0xf5, 0xce, 0x7f, 0x0f, 0xdd, 0x7d, 0xca, 0xa3, 0x39, + 0xba, 0x07, 0x83, 0x84, 0x57, 0x4c, 0xc9, 0x65, 0x9c, 0xf0, 0xd4, 0x1a, 0xef, 0x63, 0xb7, 0x3e, + 0x9b, 0xf1, 0x94, 0xa2, 0x10, 0x3a, 0x49, 0x9e, 0xca, 0x51, 0x6b, 0xdc, 0x9e, 0xb8, 0xd3, 0x5b, + 0x0d, 0xff, 0xa4, 0xd3, 0x63, 0x03, 0xfa, 0xdb, 0xd0, 0x37, 0xc1, 0x5f, 0xe5, 0xa5, 0x42, 0x53, + 0xe8, 0x52, 0x1d, 0x6a, 0xe4, 0x18, 0xf9, 0xed, 0x06, 0xb9, 0x11, 0x60, 0x8b, 0xfa, 0x09, 0xac, + 0xed, 0x53, 0x7e, 0x98, 0x2b, 0x7a, 0x1d, 0x7f, 0x4f, 0xa1, 0x97, 0x9a, 0x3a, 0xd4, 0x0e, 0xb7, + 0x7e, 0x5b, 0x75, 0x5c, 0xc3, 0xfe, 0x0c, 0xdc, 0x3a, 0x89, 0xf1, 0xf9, 0xe4, 0xb2, 0xcf, 0x3b, + 0xcd, 0x3e, 0xb5, 0x64, 0xe5, 0xf4, 0x4b, 0x1b, 0x5c, 0xcc, 0x2b, 0x95, 0xb3, 0x0c, 0x57, 0x0b, + 0x8a, 0x3c, 0x68, 0x2b, 0x92, 0xd5, 0x2e, 0xf5, 0xf2, 0x2f, 0xdd, 0xfd, 0x28, 0x7a, 0xfb, 0x9a, + 0x45, 0x47, 0xdb, 0x00, 0xba, 0x77, 0x63, 0x49, 0x58, 0x46, 0x47, 0x9d, 0xb1, 0x33, 0x71, 0xa7, + 0xe3, 0x8b, 0x32, 0xdb, 0xbe, 0x01, 0xa3, 0x2a, 0x98, 0x73, 0xa9, 0xb0, 0xe6, 0x70, 0x5f, 0xac, + 0x96, 0x68, 0x0f, 0x06, 0x75, 0x5b, 0xc7, 0x8b, 0xbc, 0x54, 0xa3, 0xae, 0x09, 0xe1, 0x37, 0x84, + 0x38, 0xb0, 0xa8, 0x2e, 0x1d, 0x76, 0xd9, 0xcf, 0x0d, 0x7a, 0x0e, 0x6e, 0xc9, 0x2b, 0x99, 0xd0, + 0xd8, 0xf8, 0xef, 0xfd, 0xd9, 0x3f, 0x58, 0x7e, 0xa6, 0xff, 0x62, 0x0b, 0xa0, 0x2a, 0xa9, 0x8c, + 0x69, 0x41, 0xf2, 0xc5, 0x68, 0x6d, 0xdc, 0x9e, 0xf4, 0x71, 0x5f, 0x9f, 0xec, 0xe9, 0x03, 0x74, + 0x17, 0xdc, 0x9c, 0x9d, 0xf0, 0x8a, 0xa5, 0xb1, 0x2e, 0xf3, 0xba, 0xf9, 0x0e, 0xf5, 0xd1, 0x11, + 0xc9, 0xfc, 0x6f, 0x0e, 0xf4, 0x66, 0xe6, 0x05, 0x40, 0xc7, 0xf0, 0x9f, 0xad, 0x65, 0x5c, 0x2a, + 0x49, 0x14, 0xcd, 0x96, 0xf5, 0x54, 0x3e, 0x6a, 0x32, 0x63, 0x5f, 0x0e, 0x7b, 0x11, 0x87, 0xb5, + 0x06, 0x0f, 0xd3, 0x4b, 0x7b, 0x3d, 0xe1, 0xb2, 0x5a, 0xd0, 0xfa, 0x36, 0x9b, 0x26, 0xfc, 0x42, + 0x4f, 0x60, 0xc3, 0xfb, 0xfb, 0x30, 0xbc, 0x1c, 0x19, 0xad, 0x43, 0x67, 0xa7, 0x8c, 0x4a, 0x3b, + 0xd4, 0xc7, 0x25, 0x8d, 0x84, 0xe7, 0x20, 0x0f, 0x06, 0x91, 0x88, 0x4e, 0x0f, 0x38, 0x7b, 0x4d, + 0x54, 0xf2, 0xc1, 0x6b, 0xa1, 0x21, 0x40, 0x24, 0xde, 0xb0, 0x5d, 0x5a, 0x10, 0x96, 0x7a, 0xed, + 0x97, 0x2f, 0xe0, 0x66, 0xc2, 0x8b, 0xab, 0xf3, 0xce, 0x9d, 0x77, 0x3d, 0xbb, 0xfa, 0xda, 0xda, + 0x78, 0x3b, 0xc5, 0x64, 0x19, 0xcc, 0x34, 0xb1, 0x23, 0x84, 0xb1, 0x44, 0xe5, 0x49, 0xcf, 0xbc, + 0x59, 0x8f, 0xbf, 0x07, 0x00, 0x00, 0xff, 0xff, 0x53, 0x7c, 0xa8, 0x94, 0x43, 0x05, 0x00, 0x00, } diff --git a/app/router/config.proto b/app/router/config.proto index b693652c..a33bf668 100644 --- a/app/router/config.proto +++ b/app/router/config.proto @@ -76,6 +76,9 @@ message Config { // Resolve to IP if the domain doesn't match any rules. IpIfNonMatch = 2; + + // Resolve to IP if any rule requires IP matching. + IpOnDemand = 3; } DomainStrategy domain_strategy = 1; repeated RoutingRule rule = 2; diff --git a/app/router/router.go b/app/router/router.go index 15837e97..78c42ad8 100644 --- a/app/router/router.go +++ b/app/router/router.go @@ -64,7 +64,42 @@ func (r *Router) resolveIP(dest net.Destination) []net.Address { return dests } +type ipResolver struct { + ip []net.Address + domain string + resolved bool + dnsServer dns.Server +} + +func (r *ipResolver) Resolve() []net.Address { + if r.resolved { + return r.ip + } + + log.Trace(newError("looking for IP for domain: ", r.domain)) + r.resolved = true + ips := r.dnsServer.Get(r.domain) + if len(ips) == 0 { + return nil + } + r.ip = make([]net.Address, len(ips)) + for i, ip := range ips { + r.ip[i] = net.IPAddress(ip) + } + return r.ip +} + func (r *Router) TakeDetour(ctx context.Context) (string, error) { + resolver := &ipResolver{ + dnsServer: r.dnsServer, + } + if r.domainStrategy == Config_IpOnDemand { + if dest, ok := proxy.TargetFromContext(ctx); ok && dest.Address.Family().IsDomain() { + resolver.domain = dest.Address.Domain() + ctx = proxy.ContextWithResolveIPs(ctx, resolver) + } + } + for _, rule := range r.rules { if rule.Apply(ctx) { return rule.Tag, nil @@ -77,10 +112,10 @@ func (r *Router) TakeDetour(ctx context.Context) (string, error) { } if r.domainStrategy == Config_IpIfNonMatch && dest.Address.Family().IsDomain() { - log.Trace(newError("looking up IP for ", dest)) - ipDests := r.resolveIP(dest) - if ipDests != nil { - ctx = proxy.ContextWithResolveIPs(ctx, ipDests) + resolver.domain = dest.Address.Domain() + ips := resolver.Resolve() + if len(ips) > 0 { + ctx = proxy.ContextWithResolveIPs(ctx, resolver) for _, rule := range r.rules { if rule.Apply(ctx) { return rule.Tag, nil diff --git a/proxy/context.go b/proxy/context.go index 2f59dd77..c3a1378c 100644 --- a/proxy/context.go +++ b/proxy/context.go @@ -64,11 +64,15 @@ func InboundTagFromContext(ctx context.Context) (string, bool) { return v, ok } -func ContextWithResolveIPs(ctx context.Context, ips []net.Address) context.Context { - return context.WithValue(ctx, resolvedIPsKey, ips) +type IPResolver interface { + Resolve() []net.Address } -func ResolvedIPsFromContext(ctx context.Context) ([]net.Address, bool) { - ips, ok := ctx.Value(resolvedIPsKey).([]net.Address) +func ContextWithResolveIPs(ctx context.Context, f IPResolver) context.Context { + return context.WithValue(ctx, resolvedIPsKey, f) +} + +func ResolvedIPsFromContext(ctx context.Context) (IPResolver, bool) { + ips, ok := ctx.Value(resolvedIPsKey).(IPResolver) return ips, ok } From 23f209075f7d78bbb97737448ac1cef2214d654c Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Wed, 15 Nov 2017 12:55:54 +0100 Subject: [PATCH 130/229] use ip if already resolved --- proxy/freedom/freedom.go | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/proxy/freedom/freedom.go b/proxy/freedom/freedom.go index ea28a8d1..c249c646 100644 --- a/proxy/freedom/freedom.go +++ b/proxy/freedom/freedom.go @@ -49,25 +49,20 @@ func New(ctx context.Context, config *Config) (*Handler, error) { return f, nil } -func (v *Handler) ResolveIP(destination net.Destination) net.Destination { - if !destination.Address.Family().IsDomain() { - return destination +func (v *Handler) ResolveIP(ctx context.Context, domain string) net.Address { + if resolver, ok := proxy.ResolvedIPsFromContext(ctx); ok { + ips := resolver.Resolve() + if len(ips) == 0 { + return nil + } + return ips[dice.Roll(len(ips))] } - ips := v.dns.Get(destination.Address.Domain()) + ips := v.dns.Get(domain) if len(ips) == 0 { - log.Trace(newError("DNS returns nil answer. Keep domain as is.")) - return destination + return nil } - - ip := ips[dice.Roll(len(ips))] - newDest := net.Destination{ - Network: destination.Network, - Address: net.IPAddress(ip), - Port: destination.Port, - } - log.Trace(newError("changing destination from ", destination, " to ", newDest)) - return newDest + return net.IPAddress(ips[dice.Roll(len(ips))]) } func (v *Handler) Process(ctx context.Context, outboundRay ray.OutboundRay, dialer proxy.Dialer) error { @@ -87,7 +82,15 @@ func (v *Handler) Process(ctx context.Context, outboundRay ray.OutboundRay, dial var conn internet.Connection if v.domainStrategy == Config_USE_IP && destination.Address.Family().IsDomain() { - destination = v.ResolveIP(destination) + ip := v.ResolveIP(ctx, destination.Address.Domain()) + if ip != nil { + destination = net.Destination{ + Network: destination.Network, + Address: ip, + Port: destination.Port, + } + log.Trace(newError("changing destination to ", destination)) + } } err := retry.ExponentialBackoff(5, 100).On(func() error { From f3ba1dbb8c4df6ab1ab53fcfe0b46a687cec9661 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Wed, 15 Nov 2017 18:28:39 +0100 Subject: [PATCH 131/229] fix lint warnings --- proxy/freedom/freedom.go | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/proxy/freedom/freedom.go b/proxy/freedom/freedom.go index c249c646..028e7c25 100644 --- a/proxy/freedom/freedom.go +++ b/proxy/freedom/freedom.go @@ -20,6 +20,7 @@ import ( "v2ray.com/core/transport/ray" ) +// Handler handles Freedom connections. type Handler struct { domainStrategy Config_DomainStrategy timeout uint32 @@ -27,6 +28,7 @@ type Handler struct { destOverride *DestinationOverride } +// New creates a new Freedom handler. func New(ctx context.Context, config *Config) (*Handler, error) { space := app.SpaceFromContext(ctx) if space == nil { @@ -49,7 +51,7 @@ func New(ctx context.Context, config *Config) (*Handler, error) { return f, nil } -func (v *Handler) ResolveIP(ctx context.Context, domain string) net.Address { +func (h *Handler) resolveIP(ctx context.Context, domain string) net.Address { if resolver, ok := proxy.ResolvedIPsFromContext(ctx); ok { ips := resolver.Resolve() if len(ips) == 0 { @@ -58,17 +60,18 @@ func (v *Handler) ResolveIP(ctx context.Context, domain string) net.Address { return ips[dice.Roll(len(ips))] } - ips := v.dns.Get(domain) + ips := h.dns.Get(domain) if len(ips) == 0 { return nil } return net.IPAddress(ips[dice.Roll(len(ips))]) } -func (v *Handler) Process(ctx context.Context, outboundRay ray.OutboundRay, dialer proxy.Dialer) error { +// Process implements proxy.Outbound. +func (h *Handler) Process(ctx context.Context, outboundRay ray.OutboundRay, dialer proxy.Dialer) error { destination, _ := proxy.TargetFromContext(ctx) - if v.destOverride != nil { - server := v.destOverride.Server + if h.destOverride != nil { + server := h.destOverride.Server destination = net.Destination{ Network: destination.Network, Address: server.Address.AsAddress(), @@ -80,9 +83,8 @@ func (v *Handler) Process(ctx context.Context, outboundRay ray.OutboundRay, dial input := outboundRay.OutboundInput() output := outboundRay.OutboundOutput() - var conn internet.Connection - if v.domainStrategy == Config_USE_IP && destination.Address.Family().IsDomain() { - ip := v.ResolveIP(ctx, destination.Address.Domain()) + if h.domainStrategy == Config_USE_IP && destination.Address.Family().IsDomain() { + ip := h.resolveIP(ctx, destination.Address.Domain()) if ip != nil { destination = net.Destination{ Network: destination.Network, @@ -93,6 +95,7 @@ func (v *Handler) Process(ctx context.Context, outboundRay ray.OutboundRay, dial } } + var conn internet.Connection err := retry.ExponentialBackoff(5, 100).On(func() error { rawConn, err := dialer.Dial(ctx, destination) if err != nil { @@ -106,7 +109,7 @@ func (v *Handler) Process(ctx context.Context, outboundRay ray.OutboundRay, dial } defer conn.Close() - timeout := time.Second * time.Duration(v.timeout) + timeout := time.Second * time.Duration(h.timeout) if timeout == 0 { timeout = time.Minute * 5 } From 743d35c059c254f946f1ca190acb0f4185dc42a8 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Wed, 15 Nov 2017 23:38:52 +0100 Subject: [PATCH 132/229] flush when not buffered --- common/buf/writer.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/common/buf/writer.go b/common/buf/writer.go index 06e037fb..d4902cba 100644 --- a/common/buf/writer.go +++ b/common/buf/writer.go @@ -67,13 +67,14 @@ func (w *BufferedWriter) Write(b []byte) (int, error) { if err != nil { return totalBytes, err } - if w.buffer.IsFull() { + if !w.buffered || w.buffer.IsFull() { if err := w.Flush(); err != nil { return totalBytes, err } } b = b[nBytes:] } + return totalBytes, nil } From cddf74334df985ee7ca19978c72b6357c43efae8 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Thu, 16 Nov 2017 04:10:03 +0100 Subject: [PATCH 133/229] improve performance for http upload --- proxy/http/server.go | 46 ++++++++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/proxy/http/server.go b/proxy/http/server.go index cfe52429..a144dd0e 100644 --- a/proxy/http/server.go +++ b/proxy/http/server.go @@ -87,10 +87,11 @@ func parseBasicAuth(auth string) (username, password string, ok bool) { } func (s *Server) Process(ctx context.Context, network net.Network, conn internet.Connection, dispatcher dispatcher.Interface) error { - reader := bufio.NewReaderSize(conn, 2048) - Start: - conn.SetReadDeadline(time.Now().Add(time.Second * 16)) + reader := bufio.NewReaderSize(conn, buf.Size) + if err := conn.SetReadDeadline(time.Now().Add(time.Second * 16)); err != nil { + return newError("unable to set read deadtime").Base(err) + } request, err := http.ReadRequest(reader) if err != nil { @@ -110,7 +111,9 @@ Start: } log.Trace(newError("request to Method [", request.Method, "] Host [", request.Host, "] with URL [", request.URL, "]")) - conn.SetReadDeadline(time.Time{}) + if err := conn.SetReadDeadline(time.Time{}); err != nil { + log.Trace(newError("unable to set back read deadline").Base(err)) + } defaultPort := net.Port(80) if strings.ToLower(request.URL.Scheme) == "https" { @@ -126,13 +129,23 @@ Start: } log.Access(conn.RemoteAddr(), request.URL, log.AccessAccepted, "") + // Get rid of bufio.Reader. + var firstPayload *buf.Buffer + if reader.Buffered() > 0 { + firstPayload = buf.New() + common.Must(firstPayload.Reset(func(b []byte) (int, error) { + return reader.Read(b[:reader.Buffered()]) + })) + } + reader = nil + if strings.ToUpper(request.Method) == "CONNECT" { - return s.handleConnect(ctx, request, reader, conn, dest, dispatcher) + return s.handleConnect(ctx, request, firstPayload, conn, conn, dest, dispatcher) } keepAlive := (strings.TrimSpace(strings.ToLower(request.Header.Get("Proxy-Connection"))) == "keep-alive") - err = s.handlePlainHTTP(ctx, request, reader, conn, dest, dispatcher) + err = s.handlePlainHTTP(ctx, request, firstPayload, conn, conn, dest, dispatcher) if err == errWaitAnother { if keepAlive { goto Start @@ -143,7 +156,7 @@ Start: return err } -func (s *Server) handleConnect(ctx context.Context, request *http.Request, reader io.Reader, writer io.Writer, dest net.Destination, dispatcher dispatcher.Interface) error { +func (s *Server) handleConnect(ctx context.Context, request *http.Request, payload *buf.Buffer, reader io.Reader, writer io.Writer, dest net.Destination, dispatcher dispatcher.Interface) error { _, err := writer.Write([]byte("HTTP/1.1 200 Connection established\r\n\r\n")) if err != nil { return newError("failed to write back OK response").Base(err) @@ -160,14 +173,17 @@ func (s *Server) handleConnect(ctx context.Context, request *http.Request, reade return err } + if !payload.IsEmpty() { + if err := ray.InboundInput().WriteMultiBuffer(buf.NewMultiBufferValue(payload)); err != nil { + return err + } + } + requestDone := signal.ExecuteAsync(func() error { defer ray.InboundInput().Close() v2reader := buf.NewReader(reader) - if err := buf.Copy(v2reader, ray.InboundInput(), buf.UpdateActivity(timer)); err != nil { - return err - } - return nil + return buf.Copy(v2reader, ray.InboundInput(), buf.UpdateActivity(timer)) }) responseDone := signal.ExecuteAsync(func() error { @@ -219,7 +235,7 @@ func StripHopByHopHeaders(header http.Header) { var errWaitAnother = newError("keep alive") -func (s *Server) handlePlainHTTP(ctx context.Context, request *http.Request, reader io.Reader, writer io.Writer, dest net.Destination, dispatcher dispatcher.Interface) error { +func (s *Server) handlePlainHTTP(ctx context.Context, request *http.Request, payload *buf.Buffer, reader io.Reader, writer io.Writer, dest net.Destination, dispatcher dispatcher.Interface) error { if !s.config.AllowTransparent && len(request.URL.Host) <= 0 { // RFC 2068 (HTTP/1.1) requires URL to be absolute URL in HTTP proxy. response := &http.Response{ @@ -251,6 +267,12 @@ func (s *Server) handlePlainHTTP(ctx context.Context, request *http.Request, rea output := ray.InboundOutput() defer input.Close() + if !payload.IsEmpty() { + if err := input.WriteMultiBuffer(buf.NewMultiBufferValue(payload)); err != nil { + return err + } + } + var result error = errWaitAnother requestDone := signal.ExecuteAsync(func() error { From c4be61e854ef321dbf93f0d20c5c1f3391d52cd9 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Thu, 16 Nov 2017 12:01:42 +0100 Subject: [PATCH 134/229] retrieve the root cause of the error --- proxy/http/server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proxy/http/server.go b/proxy/http/server.go index a144dd0e..a8c75bb4 100644 --- a/proxy/http/server.go +++ b/proxy/http/server.go @@ -65,7 +65,7 @@ func parseHost(rawHost string, defaultPort net.Port) (net.Destination, error) { } func isTimeout(err error) bool { - nerr, ok := err.(net.Error) + nerr, ok := errors.Cause(err).(net.Error) return ok && nerr.Timeout() } From 51ddc00c7094dde0d7df2465758e1ee6bf7a83a4 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Thu, 16 Nov 2017 18:11:02 +0100 Subject: [PATCH 135/229] reduce buffer size in websocket --- transport/internet/websocket/dialer.go | 4 ++-- transport/internet/websocket/hub.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/transport/internet/websocket/dialer.go b/transport/internet/websocket/dialer.go index 3386af82..bd49b228 100644 --- a/transport/internet/websocket/dialer.go +++ b/transport/internet/websocket/dialer.go @@ -35,8 +35,8 @@ func dialWebsocket(ctx context.Context, dest net.Destination) (net.Conn, error) NetDial: func(network, addr string) (net.Conn, error) { return internet.DialSystem(ctx, src, dest) }, - ReadBufferSize: 32 * 1024, - WriteBufferSize: 32 * 1024, + ReadBufferSize: 8 * 1024, + WriteBufferSize: 8 * 1024, HandshakeTimeout: time.Second * 8, } diff --git a/transport/internet/websocket/hub.go b/transport/internet/websocket/hub.go index 048df815..196624b2 100644 --- a/transport/internet/websocket/hub.go +++ b/transport/internet/websocket/hub.go @@ -22,8 +22,8 @@ type requestHandler struct { } var upgrader = &websocket.Upgrader{ - ReadBufferSize: 32 * 1024, - WriteBufferSize: 32 * 1024, + ReadBufferSize: 8 * 1024, + WriteBufferSize: 8 * 1024, HandshakeTimeout: time.Second * 8, } From 23b768576e1f477dab4bce0a325d27e5df63aa59 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Thu, 16 Nov 2017 18:34:05 +0100 Subject: [PATCH 136/229] always allocate buffer in Write --- common/buf/writer.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/common/buf/writer.go b/common/buf/writer.go index d4902cba..50ecbb8c 100644 --- a/common/buf/writer.go +++ b/common/buf/writer.go @@ -60,6 +60,10 @@ func (w *BufferedWriter) Write(b []byte) (int, error) { return w.legacyWriter.Write(b) } + if w.buffer == nil { + w.buffer = New() + } + totalBytes := 0 for len(b) > 0 { nBytes, err := w.buffer.Write(b) From aa2c1f76f435259b642b9f92018f8c988e0baaa9 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Thu, 16 Nov 2017 18:54:10 +0100 Subject: [PATCH 137/229] remove unused function --- app/router/router.go | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/app/router/router.go b/app/router/router.go index 78c42ad8..eac5abba 100644 --- a/app/router/router.go +++ b/app/router/router.go @@ -52,18 +52,6 @@ func NewRouter(ctx context.Context, config *Config) (*Router, error) { return r, nil } -func (r *Router) resolveIP(dest net.Destination) []net.Address { - ips := r.dnsServer.Get(dest.Address.Domain()) - if len(ips) == 0 { - return nil - } - dests := make([]net.Address, len(ips)) - for idx, ip := range ips { - dests[idx] = net.IPAddress(ip) - } - return dests -} - type ipResolver struct { ip []net.Address domain string From 6f885e0663b624016e78cd59db580cf7f5bb4d01 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Thu, 16 Nov 2017 23:49:26 +0100 Subject: [PATCH 138/229] Update version --- core.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core.go b/core.go index c8867d1d..4272fc46 100644 --- a/core.go +++ b/core.go @@ -18,7 +18,7 @@ import ( ) var ( - version = "2.48" + version = "2.49" build = "Custom" codename = "One for all" intro = "An unified platform for anti-censorship." From e69e6d00cb97e721941f94781c04c6b8887a9805 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 17 Nov 2017 00:51:04 +0100 Subject: [PATCH 139/229] actually run v2ctl --- main/config_json.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/main/config_json.go b/main/config_json.go index 157dee04..d348810b 100644 --- a/main/config_json.go +++ b/main/config_json.go @@ -26,7 +26,16 @@ func jsonToProto(input io.Reader) (*core.Config, error) { return nil, err } defer stdoutReader.Close() - return core.LoadConfig(core.ConfigFormat_Protobuf, stdoutReader) + + if err := cmd.Start(); err != nil { + return nil, err + } + + config, err := core.LoadConfig(core.ConfigFormat_Protobuf, stdoutReader) + + cmd.Wait() + + return config, err } func init() { From 16ee684646548ace497fa06721b1abec585ab7b7 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 17 Nov 2017 00:51:50 +0100 Subject: [PATCH 140/229] Update version --- core.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core.go b/core.go index 4272fc46..551b2406 100644 --- a/core.go +++ b/core.go @@ -18,7 +18,7 @@ import ( ) var ( - version = "2.49" + version = "2.50" build = "Custom" codename = "One for all" intro = "An unified platform for anti-censorship." From d03d72ba4073cc546e6124d8b1c4ca0355e5cd2b Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 17 Nov 2017 01:10:30 +0100 Subject: [PATCH 141/229] update --- tools/release/release-ci.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/release/release-ci.sh b/tools/release/release-ci.sh index 08eb78e8..4e183dd0 100755 --- a/tools/release/release-ci.sh +++ b/tools/release/release-ci.sh @@ -95,6 +95,7 @@ if [[ "${PRERELEASE}" == "false" ]]; then gsutil cp $GOPATH/bin/v2ray-${RELEASE_TAG}-linux-64/v2ray gs://v2ray-docker/ gsutil cp $GOPATH/bin/v2ray-${RELEASE_TAG}-linux-64/v2ctl gs://v2ray-docker/ gsutil cp $GOPATH/bin/v2ray-${RELEASE_TAG}-linux-64/geoip.dat gs://v2ray-docker/ +gsutil cp $GOPATH/bin/v2ray-${RELEASE_TAG}-linux-64/geosite.dat gs://v2ray-docker/ DOCKER_HUB_API=https://registry.hub.docker.com/u/v2ray/official/trigger/${DOCKER_HUB_KEY}/ curl -H "Content-Type: application/json" --data '{"build": true}' -X POST "${DOCKER_HUB_API}" From 41bc2a6ce4b06181669a8809cc5321987a373f28 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 17 Nov 2017 02:56:24 +0000 Subject: [PATCH 142/229] Revert "improve performance for http upload" This reverts commit cddf74334df985ee7ca19978c72b6357c43efae8. --- proxy/http/server.go | 46 ++++++++++++-------------------------------- 1 file changed, 12 insertions(+), 34 deletions(-) diff --git a/proxy/http/server.go b/proxy/http/server.go index a8c75bb4..d61f70ec 100644 --- a/proxy/http/server.go +++ b/proxy/http/server.go @@ -87,11 +87,10 @@ func parseBasicAuth(auth string) (username, password string, ok bool) { } func (s *Server) Process(ctx context.Context, network net.Network, conn internet.Connection, dispatcher dispatcher.Interface) error { + reader := bufio.NewReaderSize(conn, 2048) + Start: - reader := bufio.NewReaderSize(conn, buf.Size) - if err := conn.SetReadDeadline(time.Now().Add(time.Second * 16)); err != nil { - return newError("unable to set read deadtime").Base(err) - } + conn.SetReadDeadline(time.Now().Add(time.Second * 16)) request, err := http.ReadRequest(reader) if err != nil { @@ -111,9 +110,7 @@ Start: } log.Trace(newError("request to Method [", request.Method, "] Host [", request.Host, "] with URL [", request.URL, "]")) - if err := conn.SetReadDeadline(time.Time{}); err != nil { - log.Trace(newError("unable to set back read deadline").Base(err)) - } + conn.SetReadDeadline(time.Time{}) defaultPort := net.Port(80) if strings.ToLower(request.URL.Scheme) == "https" { @@ -129,23 +126,13 @@ Start: } log.Access(conn.RemoteAddr(), request.URL, log.AccessAccepted, "") - // Get rid of bufio.Reader. - var firstPayload *buf.Buffer - if reader.Buffered() > 0 { - firstPayload = buf.New() - common.Must(firstPayload.Reset(func(b []byte) (int, error) { - return reader.Read(b[:reader.Buffered()]) - })) - } - reader = nil - if strings.ToUpper(request.Method) == "CONNECT" { - return s.handleConnect(ctx, request, firstPayload, conn, conn, dest, dispatcher) + return s.handleConnect(ctx, request, reader, conn, dest, dispatcher) } keepAlive := (strings.TrimSpace(strings.ToLower(request.Header.Get("Proxy-Connection"))) == "keep-alive") - err = s.handlePlainHTTP(ctx, request, firstPayload, conn, conn, dest, dispatcher) + err = s.handlePlainHTTP(ctx, request, reader, conn, dest, dispatcher) if err == errWaitAnother { if keepAlive { goto Start @@ -156,7 +143,7 @@ Start: return err } -func (s *Server) handleConnect(ctx context.Context, request *http.Request, payload *buf.Buffer, reader io.Reader, writer io.Writer, dest net.Destination, dispatcher dispatcher.Interface) error { +func (s *Server) handleConnect(ctx context.Context, request *http.Request, reader io.Reader, writer io.Writer, dest net.Destination, dispatcher dispatcher.Interface) error { _, err := writer.Write([]byte("HTTP/1.1 200 Connection established\r\n\r\n")) if err != nil { return newError("failed to write back OK response").Base(err) @@ -173,17 +160,14 @@ func (s *Server) handleConnect(ctx context.Context, request *http.Request, paylo return err } - if !payload.IsEmpty() { - if err := ray.InboundInput().WriteMultiBuffer(buf.NewMultiBufferValue(payload)); err != nil { - return err - } - } - requestDone := signal.ExecuteAsync(func() error { defer ray.InboundInput().Close() v2reader := buf.NewReader(reader) - return buf.Copy(v2reader, ray.InboundInput(), buf.UpdateActivity(timer)) + if err := buf.Copy(v2reader, ray.InboundInput(), buf.UpdateActivity(timer)); err != nil { + return err + } + return nil }) responseDone := signal.ExecuteAsync(func() error { @@ -235,7 +219,7 @@ func StripHopByHopHeaders(header http.Header) { var errWaitAnother = newError("keep alive") -func (s *Server) handlePlainHTTP(ctx context.Context, request *http.Request, payload *buf.Buffer, reader io.Reader, writer io.Writer, dest net.Destination, dispatcher dispatcher.Interface) error { +func (s *Server) handlePlainHTTP(ctx context.Context, request *http.Request, reader io.Reader, writer io.Writer, dest net.Destination, dispatcher dispatcher.Interface) error { if !s.config.AllowTransparent && len(request.URL.Host) <= 0 { // RFC 2068 (HTTP/1.1) requires URL to be absolute URL in HTTP proxy. response := &http.Response{ @@ -267,12 +251,6 @@ func (s *Server) handlePlainHTTP(ctx context.Context, request *http.Request, pay output := ray.InboundOutput() defer input.Close() - if !payload.IsEmpty() { - if err := input.WriteMultiBuffer(buf.NewMultiBufferValue(payload)); err != nil { - return err - } - } - var result error = errWaitAnother requestDone := signal.ExecuteAsync(func() error { From 88b521c77e74480cb0c56f5865fe8e4a5ba5c1b6 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 17 Nov 2017 03:03:27 +0000 Subject: [PATCH 143/229] remove debug info --- app/dns/server/nameserver.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/dns/server/nameserver.go b/app/dns/server/nameserver.go index c1c3e5ac..c0ab53c8 100644 --- a/app/dns/server/nameserver.go +++ b/app/dns/server/nameserver.go @@ -2,7 +2,6 @@ package server import ( "context" - "fmt" "sync" "time" @@ -123,7 +122,6 @@ func (v *UDPNameServer) HandleResponse(payload *buf.Buffer) { switch rr := rr.(type) { case *dns.A: record.IPs = append(record.IPs, rr.A) - fmt.Println("Adding ans:", rr.A) if rr.Hdr.Ttl < ttl { ttl = rr.Hdr.Ttl } From afcad409e241af790cc4522563ec852566aebf2f Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 17 Nov 2017 09:18:12 +0000 Subject: [PATCH 144/229] reallocate in for loop --- common/buf/writer.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/common/buf/writer.go b/common/buf/writer.go index 50ecbb8c..581a8668 100644 --- a/common/buf/writer.go +++ b/common/buf/writer.go @@ -60,12 +60,12 @@ func (w *BufferedWriter) Write(b []byte) (int, error) { return w.legacyWriter.Write(b) } - if w.buffer == nil { - w.buffer = New() - } - totalBytes := 0 for len(b) > 0 { + if w.buffer == nil { + w.buffer = New() + } + nBytes, err := w.buffer.Write(b) totalBytes += nBytes if err != nil { From b859bdf684895844e0dd9198e3eaa1efbef879a8 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 17 Nov 2017 16:53:00 +0100 Subject: [PATCH 145/229] test case for http post and connect --- testing/scenarios/http_test.go | 142 +++++++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) diff --git a/testing/scenarios/http_test.go b/testing/scenarios/http_test.go index d92d99f7..761206fb 100644 --- a/testing/scenarios/http_test.go +++ b/testing/scenarios/http_test.go @@ -1,11 +1,17 @@ package scenarios import ( + "bytes" + "crypto/rand" + "io" "io/ioutil" "net/http" "net/url" "testing" + "v2ray.com/core/common" + "v2ray.com/core/common/buf" + "v2ray.com/core" "v2ray.com/core/app/proxyman" "v2ray.com/core/common/net" @@ -13,6 +19,7 @@ import ( "v2ray.com/core/proxy/freedom" v2http "v2ray.com/core/proxy/http" v2httptest "v2ray.com/core/testing/servers/http" + "v2ray.com/core/testing/servers/tcp" . "v2ray.com/ext/assert" ) @@ -73,6 +80,141 @@ func TestHttpConformance(t *testing.T) { CloseAllServers(servers) } +func TestHttpConnectMethod(t *testing.T) { + assert := With(t) + + tcpServer := tcp.Server{ + MsgProcessor: xor, + } + dest, err := tcpServer.Start() + assert(err, IsNil) + defer tcpServer.Close() + + serverPort := pickPort() + serverConfig := &core.Config{ + Inbound: []*proxyman.InboundHandlerConfig{ + { + ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ + PortRange: net.SinglePortRange(serverPort), + Listen: net.NewIPOrDomain(net.LocalHostIP), + }), + ProxySettings: serial.ToTypedMessage(&v2http.ServerConfig{}), + }, + }, + Outbound: []*proxyman.OutboundHandlerConfig{ + { + ProxySettings: serial.ToTypedMessage(&freedom.Config{}), + }, + }, + } + + servers, err := InitializeServerConfigs(serverConfig) + assert(err, IsNil) + + { + transport := &http.Transport{ + Proxy: func(req *http.Request) (*url.URL, error) { + return url.Parse("http://127.0.0.1:" + serverPort.String()) + }, + } + + client := &http.Client{ + Transport: transport, + } + + payload := make([]byte, 1024*64) + common.Must2(rand.Read(payload)) + req, err := http.NewRequest("Connect", "http://"+dest.NetAddr()+"/", bytes.NewReader(payload)) + common.Must(err) + + resp, err := client.Do(req) + assert(err, IsNil) + assert(resp.StatusCode, Equals, 200) + + content := make([]byte, len(payload)) + common.Must2(io.ReadFull(resp.Body, content)) + assert(err, IsNil) + assert(content, Equals, xor(payload)) + + } + + CloseAllServers(servers) +} + +func TestHttpPost(t *testing.T) { + assert := With(t) + + httpServerPort := pickPort() + httpServer := &v2httptest.Server{ + Port: httpServerPort, + PathHandler: map[string]http.HandlerFunc{ + "/testpost": func(w http.ResponseWriter, r *http.Request) { + payload, err := buf.ReadAllToBytes(r.Body) + r.Body.Close() + + if err != nil { + w.WriteHeader(500) + w.Write([]byte("Unable to read all payload")) + return + } + payload = xor(payload) + w.Write(payload) + }, + }, + } + + _, err := httpServer.Start() + assert(err, IsNil) + defer httpServer.Close() + + serverPort := pickPort() + serverConfig := &core.Config{ + Inbound: []*proxyman.InboundHandlerConfig{ + { + ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ + PortRange: net.SinglePortRange(serverPort), + Listen: net.NewIPOrDomain(net.LocalHostIP), + }), + ProxySettings: serial.ToTypedMessage(&v2http.ServerConfig{}), + }, + }, + Outbound: []*proxyman.OutboundHandlerConfig{ + { + ProxySettings: serial.ToTypedMessage(&freedom.Config{}), + }, + }, + } + + servers, err := InitializeServerConfigs(serverConfig) + assert(err, IsNil) + + { + transport := &http.Transport{ + Proxy: func(req *http.Request) (*url.URL, error) { + return url.Parse("http://127.0.0.1:" + serverPort.String()) + }, + } + + client := &http.Client{ + Transport: transport, + } + + payload := make([]byte, 1024*64) + common.Must2(rand.Read(payload)) + + resp, err := client.Post("http://127.0.0.1:"+httpServerPort.String()+"/testpost", "application/x-www-form-urlencoded", bytes.NewReader(payload)) + assert(err, IsNil) + assert(resp.StatusCode, Equals, 200) + + content, err := ioutil.ReadAll(resp.Body) + assert(err, IsNil) + assert(content, Equals, xor(payload)) + + } + + CloseAllServers(servers) +} + func setProxyBasicAuth(req *http.Request, user, pass string) { req.SetBasicAuth(user, pass) req.Header.Set("Proxy-Authorization", req.Header.Get("Authorization")) From 5e8cf7bde6c5360275bf2c6d271fd5cc4252bbde Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 17 Nov 2017 20:54:24 +0100 Subject: [PATCH 146/229] redo http upload performance --- proxy/http/server.go | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/proxy/http/server.go b/proxy/http/server.go index d61f70ec..df426314 100644 --- a/proxy/http/server.go +++ b/proxy/http/server.go @@ -87,7 +87,7 @@ func parseBasicAuth(auth string) (username, password string, ok bool) { } func (s *Server) Process(ctx context.Context, network net.Network, conn internet.Connection, dispatcher dispatcher.Interface) error { - reader := bufio.NewReaderSize(conn, 2048) + reader := bufio.NewReaderSize(conn, buf.Size) Start: conn.SetReadDeadline(time.Now().Add(time.Second * 16)) @@ -132,7 +132,7 @@ Start: keepAlive := (strings.TrimSpace(strings.ToLower(request.Header.Get("Proxy-Connection"))) == "keep-alive") - err = s.handlePlainHTTP(ctx, request, reader, conn, dest, dispatcher) + err = s.handlePlainHTTP(ctx, request, conn, dest, dispatcher) if err == errWaitAnother { if keepAlive { goto Start @@ -143,8 +143,8 @@ Start: return err } -func (s *Server) handleConnect(ctx context.Context, request *http.Request, reader io.Reader, writer io.Writer, dest net.Destination, dispatcher dispatcher.Interface) error { - _, err := writer.Write([]byte("HTTP/1.1 200 Connection established\r\n\r\n")) +func (s *Server) handleConnect(ctx context.Context, request *http.Request, reader *bufio.Reader, conn internet.Connection, dest net.Destination, dispatcher dispatcher.Interface) error { + _, err := conn.Write([]byte("HTTP/1.1 200 Connection established\r\n\r\n")) if err != nil { return newError("failed to write back OK response").Base(err) } @@ -160,10 +160,20 @@ func (s *Server) handleConnect(ctx context.Context, request *http.Request, reade return err } + if reader.Buffered() > 0 { + payload := buf.New() + common.Must(payload.Reset(func(b []byte) (int, error) { + return reader.Read(b[:reader.Buffered()]) + })) + if err := ray.InboundInput().WriteMultiBuffer(buf.NewMultiBufferValue(payload)); err != nil { + return err + } + } + requestDone := signal.ExecuteAsync(func() error { defer ray.InboundInput().Close() - v2reader := buf.NewReader(reader) + v2reader := buf.NewReader(conn) if err := buf.Copy(v2reader, ray.InboundInput(), buf.UpdateActivity(timer)); err != nil { return err } @@ -171,7 +181,7 @@ func (s *Server) handleConnect(ctx context.Context, request *http.Request, reade }) responseDone := signal.ExecuteAsync(func() error { - v2writer := buf.NewWriter(writer) + v2writer := buf.NewWriter(conn) if err := buf.Copy(ray.InboundOutput(), v2writer, buf.UpdateActivity(timer)); err != nil { return err } @@ -219,7 +229,7 @@ func StripHopByHopHeaders(header http.Header) { var errWaitAnother = newError("keep alive") -func (s *Server) handlePlainHTTP(ctx context.Context, request *http.Request, reader io.Reader, writer io.Writer, dest net.Destination, dispatcher dispatcher.Interface) error { +func (s *Server) handlePlainHTTP(ctx context.Context, request *http.Request, writer io.Writer, dest net.Destination, dispatcher dispatcher.Interface) error { if !s.config.AllowTransparent && len(request.URL.Host) <= 0 { // RFC 2068 (HTTP/1.1) requires URL to be absolute URL in HTTP proxy. response := &http.Response{ From a6393449e0dd2a77606718427c7e1ca76c4db2cb Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 17 Nov 2017 20:58:46 +0100 Subject: [PATCH 147/229] force reader to be nil --- proxy/http/server.go | 1 + 1 file changed, 1 insertion(+) diff --git a/proxy/http/server.go b/proxy/http/server.go index df426314..04b9127f 100644 --- a/proxy/http/server.go +++ b/proxy/http/server.go @@ -168,6 +168,7 @@ func (s *Server) handleConnect(ctx context.Context, request *http.Request, reade if err := ray.InboundInput().WriteMultiBuffer(buf.NewMultiBufferValue(payload)); err != nil { return err } + reader = nil } requestDone := signal.ExecuteAsync(func() error { From 028b2b74c922355e98fad15988b6feb1b066d25a Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 17 Nov 2017 21:02:32 +0100 Subject: [PATCH 148/229] fix lint warning --- proxy/http/server.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/proxy/http/server.go b/proxy/http/server.go index 04b9127f..4bf81e3d 100644 --- a/proxy/http/server.go +++ b/proxy/http/server.go @@ -175,10 +175,7 @@ func (s *Server) handleConnect(ctx context.Context, request *http.Request, reade defer ray.InboundInput().Close() v2reader := buf.NewReader(conn) - if err := buf.Copy(v2reader, ray.InboundInput(), buf.UpdateActivity(timer)); err != nil { - return err - } - return nil + return buf.Copy(v2reader, ray.InboundInput(), buf.UpdateActivity(timer)) }) responseDone := signal.ExecuteAsync(func() error { From 575149080236c75e9138f7d9d38cdb9167b4ac2c Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 17 Nov 2017 21:15:35 +0100 Subject: [PATCH 149/229] Update version --- core.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core.go b/core.go index 551b2406..b2bbb300 100644 --- a/core.go +++ b/core.go @@ -18,7 +18,7 @@ import ( ) var ( - version = "2.50" + version = "2.51" build = "Custom" codename = "One for all" intro = "An unified platform for anti-censorship." From 5c9f54a4538df1465f9e3caf5a321886e3dd8ae6 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sat, 18 Nov 2017 19:37:36 +0100 Subject: [PATCH 150/229] fix length check in auth reader --- common/crypto/auth.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/crypto/auth.go b/common/crypto/auth.go index cd29a6a0..28a7c68c 100644 --- a/common/crypto/auth.go +++ b/common/crypto/auth.go @@ -162,7 +162,7 @@ func (r *AuthenticationReader) ReadMultiBuffer() (buf.MultiBuffer, error) { mb.Write(b) } else { var bb *buf.Buffer - if len(b) < buf.Size { + if len(b) <= buf.Size { bb = buf.New() } else { bb = buf.NewLocal(len(b)) @@ -180,7 +180,7 @@ func (r *AuthenticationReader) ReadMultiBuffer() (buf.MultiBuffer, error) { mb.Write(b) } else { var bb *buf.Buffer - if len(b) < buf.Size { + if len(b) <= buf.Size { bb = buf.New() } else { bb = buf.NewLocal(len(b)) From ed1243b32b91dfcf1f652f140f6e97d50cc64af4 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sat, 18 Nov 2017 19:40:53 +0100 Subject: [PATCH 151/229] require proxy auth when not set. fix #712 --- proxy/http/server.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/proxy/http/server.go b/proxy/http/server.go index 4bf81e3d..76970517 100644 --- a/proxy/http/server.go +++ b/proxy/http/server.go @@ -103,7 +103,11 @@ Start: if len(s.config.Accounts) > 0 { user, pass, ok := parseBasicAuth(request.Header.Get("Proxy-Authorization")) - if !ok || !s.config.HasAccount(user, pass) { + if !ok { + _, err := conn.Write([]byte("HTTP/1.1 407 Proxy Authentication Required\r\n\r\n")) + return err + } + if !s.config.HasAccount(user, pass) { _, err := conn.Write([]byte("HTTP/1.1 401 UNAUTHORIZED\r\n\r\n")) return err } From 878d412c6aac2be860d9b5cf2ef130111ad8b881 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sat, 18 Nov 2017 20:00:09 +0100 Subject: [PATCH 152/229] handle truncated DNS messages. fix #713 --- app/dns/server/nameserver.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/dns/server/nameserver.go b/app/dns/server/nameserver.go index c0ab53c8..0c21d0a7 100644 --- a/app/dns/server/nameserver.go +++ b/app/dns/server/nameserver.go @@ -98,7 +98,9 @@ func (v *UDPNameServer) AssignUnusedID(response chan<- *ARecord) uint16 { func (v *UDPNameServer) HandleResponse(payload *buf.Buffer) { msg := new(dns.Msg) err := msg.Unpack(payload.Bytes()) - if err != nil { + if err == dns.ErrTruncated { + log.Trace(newError("truncated message received. DNS server should still work. If you see anything abnormal, please submit an issue to v2ray-core.").AtWarning()) + } else if err != nil { log.Trace(newError("failed to parse DNS response").Base(err).AtWarning()) return } From c0564cd747715391ec8c345beebc9b39fdb87611 Mon Sep 17 00:00:00 2001 From: IbarakiKasen Date: Sun, 19 Nov 2017 13:46:31 +0800 Subject: [PATCH 153/229] Fix typo, fix #715 --- transport/internet/udp/dispatcher.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/transport/internet/udp/dispatcher.go b/transport/internet/udp/dispatcher.go index 9867d03f..d2c155a1 100644 --- a/transport/internet/udp/dispatcher.go +++ b/transport/internet/udp/dispatcher.go @@ -99,7 +99,7 @@ func handleInput(ctx context.Context, conn *connEntry, callback ResponseCallback mb, err := input.ReadMultiBuffer() if err != nil { - log.Trace(newError("failed to handl UDP input").Base(err)) + log.Trace(newError("failed to handle UDP input").Base(err)) conn.cancel() return } From 8fb69fc2b6554ac1fc7a6787dcf99606c07372cc Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 19 Nov 2017 20:42:34 +0100 Subject: [PATCH 154/229] send IPv6 query only to supported server. --- app/dns/server/nameserver.go | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/app/dns/server/nameserver.go b/app/dns/server/nameserver.go index 0c21d0a7..8e245003 100644 --- a/app/dns/server/nameserver.go +++ b/app/dns/server/nameserver.go @@ -22,6 +22,12 @@ const ( var ( pseudoDestination = net.UDPDestination(net.LocalHostIP, net.Port(53)) + + multiQuestionDns = map[net.Address]bool{ + net.IPAddress([]byte{8, 8, 8, 8}): true, + net.IPAddress([]byte{8, 8, 4, 4}): true, + net.IPAddress([]byte{9, 9, 9, 9}): true, + } ) type ARecord struct { @@ -150,12 +156,14 @@ func (v *UDPNameServer) BuildQueryA(domain string, id uint16) *buf.Buffer { Name: dns.Fqdn(domain), Qtype: dns.TypeA, Qclass: dns.ClassINET, - }, - { + }} + if multiQuestionDns[v.address.Address] { + msg.Question = append(msg.Question, dns.Question{ Name: dns.Fqdn(domain), Qtype: dns.TypeAAAA, Qclass: dns.ClassINET, - }} + }) + } buffer := buf.New() common.Must(buffer.Reset(func(b []byte) (int, error) { From afacee9e05c24c49ff921543a2eb0f854f157ee1 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 19 Nov 2017 21:43:20 +0100 Subject: [PATCH 155/229] refactor --- app/dns/server/nameserver.go | 63 +++++++++++++++++------------------- 1 file changed, 30 insertions(+), 33 deletions(-) diff --git a/app/dns/server/nameserver.go b/app/dns/server/nameserver.go index 8e245003..ad007b2b 100644 --- a/app/dns/server/nameserver.go +++ b/app/dns/server/nameserver.go @@ -21,9 +21,7 @@ const ( ) var ( - pseudoDestination = net.UDPDestination(net.LocalHostIP, net.Port(53)) - - multiQuestionDns = map[net.Address]bool{ + multiQuestionDNS = map[net.Address]bool{ net.IPAddress([]byte{8, 8, 8, 8}): true, net.IPAddress([]byte{8, 8, 4, 4}): true, net.IPAddress([]byte{9, 9, 9, 9}): true, @@ -61,47 +59,47 @@ func NewUDPNameServer(address net.Destination, dispatcher dispatcher.Interface) return s } -func (v *UDPNameServer) Cleanup() { +func (s *UDPNameServer) Cleanup() { expiredRequests := make([]uint16, 0, 16) now := time.Now() - v.Lock() - for id, r := range v.requests { + s.Lock() + for id, r := range s.requests { if r.expire.Before(now) { expiredRequests = append(expiredRequests, id) close(r.response) } } for _, id := range expiredRequests { - delete(v.requests, id) + delete(s.requests, id) } - v.Unlock() + s.Unlock() } -func (v *UDPNameServer) AssignUnusedID(response chan<- *ARecord) uint16 { +func (s *UDPNameServer) AssignUnusedID(response chan<- *ARecord) uint16 { var id uint16 - v.Lock() - if len(v.requests) > CleanupThreshold && v.nextCleanup.Before(time.Now()) { - v.nextCleanup = time.Now().Add(CleanupInterval) - go v.Cleanup() + s.Lock() + if len(s.requests) > CleanupThreshold && s.nextCleanup.Before(time.Now()) { + s.nextCleanup = time.Now().Add(CleanupInterval) + go s.Cleanup() } for { id = dice.RollUint16() - if _, found := v.requests[id]; found { + if _, found := s.requests[id]; found { continue } log.Trace(newError("add pending request id ", id).AtDebug()) - v.requests[id] = &PendingRequest{ + s.requests[id] = &PendingRequest{ expire: time.Now().Add(time.Second * 8), response: response, } break } - v.Unlock() + s.Unlock() return id } -func (v *UDPNameServer) HandleResponse(payload *buf.Buffer) { +func (s *UDPNameServer) HandleResponse(payload *buf.Buffer) { msg := new(dns.Msg) err := msg.Unpack(payload.Bytes()) if err == dns.ErrTruncated { @@ -117,14 +115,14 @@ func (v *UDPNameServer) HandleResponse(payload *buf.Buffer) { ttl := uint32(3600) // an hour log.Trace(newError("handling response for id ", id, " content: ", msg).AtDebug()) - v.Lock() - request, found := v.requests[id] + s.Lock() + request, found := s.requests[id] if !found { - v.Unlock() + s.Unlock() return } - delete(v.requests, id) - v.Unlock() + delete(s.requests, id) + s.Unlock() for _, rr := range msg.Answer { switch rr := rr.(type) { @@ -146,8 +144,7 @@ func (v *UDPNameServer) HandleResponse(payload *buf.Buffer) { close(request.response) } -func (v *UDPNameServer) BuildQueryA(domain string, id uint16) *buf.Buffer { - +func (s *UDPNameServer) BuildQueryA(domain string, id uint16) *buf.Buffer { msg := new(dns.Msg) msg.Id = id msg.RecursionDesired = true @@ -157,7 +154,7 @@ func (v *UDPNameServer) BuildQueryA(domain string, id uint16) *buf.Buffer { Qtype: dns.TypeA, Qclass: dns.ClassINET, }} - if multiQuestionDns[v.address.Address] { + if multiQuestionDNS[s.address.Address] { msg.Question = append(msg.Question, dns.Question{ Name: dns.Fqdn(domain), Qtype: dns.TypeAAAA, @@ -174,23 +171,23 @@ func (v *UDPNameServer) BuildQueryA(domain string, id uint16) *buf.Buffer { return buffer } -func (v *UDPNameServer) QueryA(domain string) <-chan *ARecord { +func (s *UDPNameServer) QueryA(domain string) <-chan *ARecord { response := make(chan *ARecord, 1) - id := v.AssignUnusedID(response) + id := s.AssignUnusedID(response) ctx, cancel := context.WithCancel(context.Background()) - v.udpServer.Dispatch(ctx, v.address, v.BuildQueryA(domain, id), v.HandleResponse) + s.udpServer.Dispatch(ctx, s.address, s.BuildQueryA(domain, id), s.HandleResponse) go func() { for i := 0; i < 2; i++ { time.Sleep(time.Second) - v.Lock() - _, found := v.requests[id] - v.Unlock() + s.Lock() + _, found := s.requests[id] + s.Unlock() if !found { break } - v.udpServer.Dispatch(ctx, v.address, v.BuildQueryA(domain, id), v.HandleResponse) + s.udpServer.Dispatch(ctx, s.address, s.BuildQueryA(domain, id), s.HandleResponse) } cancel() }() @@ -201,7 +198,7 @@ func (v *UDPNameServer) QueryA(domain string) <-chan *ARecord { type LocalNameServer struct { } -func (v *LocalNameServer) QueryA(domain string) <-chan *ARecord { +func (*LocalNameServer) QueryA(domain string) <-chan *ARecord { response := make(chan *ARecord, 1) go func() { From ee8d2ebfa9a50d1ea1f22a48a04995e00abce3fc Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 19 Nov 2017 21:44:49 +0100 Subject: [PATCH 156/229] remove json parser from core --- main/config_json.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/main/config_json.go b/main/config_json.go index d348810b..6a826d7a 100644 --- a/main/config_json.go +++ b/main/config_json.go @@ -6,9 +6,7 @@ import ( "os/exec" "v2ray.com/core" - "v2ray.com/core/app/log" "v2ray.com/core/common/platform" - jsonconf "v2ray.com/ext/tools/conf/serial" ) func jsonToProto(input io.Reader) (*core.Config, error) { @@ -42,8 +40,7 @@ func init() { core.RegisterConfigLoader(core.ConfigFormat_JSON, func(input io.Reader) (*core.Config, error) { config, err := jsonToProto(input) if err != nil { - log.Trace(newError("failed to execute v2ctl to convert config file.").Base(err).AtWarning()) - return jsonconf.LoadJSONConfig(input) + return nil, newError("failed to execute v2ctl to convert config file.").Base(err) } return config, nil }) From ec8f8d4e10d4f942cfd8f4a21255f1eb2359534f Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Mon, 20 Nov 2017 11:13:27 +0100 Subject: [PATCH 157/229] remove check for ReaderFrom on underlying writer, as it may be badly implemented. --- common/buf/writer.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/common/buf/writer.go b/common/buf/writer.go index 581a8668..25a3d03f 100644 --- a/common/buf/writer.go +++ b/common/buf/writer.go @@ -137,12 +137,8 @@ func (w *BufferedWriter) ReadFrom(reader io.Reader) (int64, error) { } w.buffered = false - - if readerFrom, ok := w.writer.(io.ReaderFrom); ok { - return readerFrom.ReadFrom(reader) - } - err := Copy(NewReader(reader), w, CountSize(&sc)) + return sc.Size, err } From 9f146ac7d224f46dfa61af1f0c77750351e2ae96 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Mon, 20 Nov 2017 11:27:33 +0100 Subject: [PATCH 158/229] cleanup --- proxy/http/server.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/proxy/http/server.go b/proxy/http/server.go index 76970517..ab96f731 100644 --- a/proxy/http/server.go +++ b/proxy/http/server.go @@ -167,7 +167,7 @@ func (s *Server) handleConnect(ctx context.Context, request *http.Request, reade if reader.Buffered() > 0 { payload := buf.New() common.Must(payload.Reset(func(b []byte) (int, error) { - return reader.Read(b[:reader.Buffered()]) + return reader.Read(b) })) if err := ray.InboundInput().WriteMultiBuffer(buf.NewMultiBufferValue(payload)); err != nil { return err @@ -274,7 +274,7 @@ func (s *Server) handlePlainHTTP(ctx context.Context, request *http.Request, wri }) responseDone := signal.ExecuteAsync(func() error { - responseReader := bufio.NewReaderSize(buf.NewBufferedReader(ray.InboundOutput()), 2048) + responseReader := bufio.NewReaderSize(buf.NewBufferedReader(ray.InboundOutput()), buf.Size) response, err := http.ReadResponse(responseReader, request) if err == nil { StripHopByHopHeaders(response.Header) From c51251bbdb4aa63a0aba35872553242cfab4d81c Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Mon, 20 Nov 2017 11:27:41 +0100 Subject: [PATCH 159/229] fix broken test --- testing/scenarios/http_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing/scenarios/http_test.go b/testing/scenarios/http_test.go index 761206fb..64675143 100644 --- a/testing/scenarios/http_test.go +++ b/testing/scenarios/http_test.go @@ -272,7 +272,7 @@ func TestHttpBasicAuth(t *testing.T) { { resp, err := client.Get("http://127.0.0.1:" + httpServerPort.String()) assert(err, IsNil) - assert(resp.StatusCode, Equals, 401) + assert(resp.StatusCode, Equals, 407) } { From 66ebeaa0ca28a888b3ca445ab8217bc8c41e4006 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Tue, 21 Nov 2017 16:53:07 +0100 Subject: [PATCH 160/229] cleanup --- common/buf/writer.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/common/buf/writer.go b/common/buf/writer.go index 25a3d03f..2ea3cad9 100644 --- a/common/buf/writer.go +++ b/common/buf/writer.go @@ -27,10 +27,6 @@ func (w *BufferToBytesWriter) WriteMultiBuffer(mb MultiBuffer) error { } func (w *BufferToBytesWriter) ReadFrom(reader io.Reader) (int64, error) { - if readerFrom, ok := w.Writer.(io.ReaderFrom); ok { - return readerFrom.ReadFrom(reader) - } - var sc SizeCounter err := Copy(NewReader(reader), w, CountSize(&sc)) return sc.Size, err From fcc66704fad97b12c7bc126122f28fd533a73726 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Tue, 21 Nov 2017 16:55:22 +0100 Subject: [PATCH 161/229] comments --- common/buf/writer.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/common/buf/writer.go b/common/buf/writer.go index 2ea3cad9..f51fa3fb 100644 --- a/common/buf/writer.go +++ b/common/buf/writer.go @@ -26,12 +26,14 @@ func (w *BufferToBytesWriter) WriteMultiBuffer(mb MultiBuffer) error { return err } +// ReadFrom implements io.ReaderFrom. func (w *BufferToBytesWriter) ReadFrom(reader io.Reader) (int64, error) { var sc SizeCounter err := Copy(NewReader(reader), w, CountSize(&sc)) return sc.Size, err } +// BufferedWriter is a Writer with internal buffer. type BufferedWriter struct { writer Writer legacyWriter io.Writer @@ -39,6 +41,7 @@ type BufferedWriter struct { buffered bool } +// NewBufferedWriter creates a new BufferedWriter. func NewBufferedWriter(writer Writer) *BufferedWriter { w := &BufferedWriter{ writer: writer, @@ -51,6 +54,7 @@ func NewBufferedWriter(writer Writer) *BufferedWriter { return w } +// Write implements io.Writer. func (w *BufferedWriter) Write(b []byte) (int, error) { if !w.buffered && w.legacyWriter != nil { return w.legacyWriter.Write(b) @@ -78,6 +82,7 @@ func (w *BufferedWriter) Write(b []byte) (int, error) { return totalBytes, nil } +// WriteMultiBuffer implements Writer. It takes ownership of the given MultiBuffer. func (w *BufferedWriter) WriteMultiBuffer(b MultiBuffer) error { if !w.buffered { return w.writer.WriteMultiBuffer(b) @@ -99,6 +104,7 @@ func (w *BufferedWriter) WriteMultiBuffer(b MultiBuffer) error { return nil } +// Flush flushes buffered content into underlying writer. func (w *BufferedWriter) Flush() error { if !w.buffer.IsEmpty() { if err := w.writer.WriteMultiBuffer(NewMultiBufferValue(w.buffer)); err != nil { From b0ac43a8fcf848e96a58e175ab3244e9a46a537f Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Tue, 21 Nov 2017 17:02:55 +0100 Subject: [PATCH 162/229] comments --- common/buf/copy.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/common/buf/copy.go b/common/buf/copy.go index f8d4577e..654bf0a4 100644 --- a/common/buf/copy.go +++ b/common/buf/copy.go @@ -40,8 +40,10 @@ type SizeCounter struct { Size int64 } +// CopyOption is an option for copying data. type CopyOption func(*copyHandler) +// IgnoreReaderError is a CopyOption that ignores errors from reader. Copy will continue in such case. func IgnoreReaderError() CopyOption { return func(handler *copyHandler) { handler.onReadError = append(handler.onReadError, func(err error) error { @@ -50,6 +52,7 @@ func IgnoreReaderError() CopyOption { } } +// IgnoreWriterError is a CopyOption that ignores errors from writer. Copy will continue in such case. func IgnoreWriterError() CopyOption { return func(handler *copyHandler) { handler.onWriteError = append(handler.onWriteError, func(err error) error { @@ -58,6 +61,7 @@ func IgnoreWriterError() CopyOption { } } +// UpdateActivity is a CopyOption to update activity on each data copy operation. func UpdateActivity(timer signal.ActivityUpdater) CopyOption { return func(handler *copyHandler) { handler.onData = append(handler.onData, func(MultiBuffer) { @@ -66,6 +70,7 @@ func UpdateActivity(timer signal.ActivityUpdater) CopyOption { } } +// CountSize is a CopyOption that sums the total size of data copied into the given SizeCounter. func CountSize(sc *SizeCounter) CopyOption { return func(handler *copyHandler) { handler.onData = append(handler.onData, func(b MultiBuffer) { @@ -97,8 +102,7 @@ func copyInternal(reader Reader, writer Writer, handler *copyHandler) error { } } -// Copy dumps all payload from reader to writer or stops when an error occurs. -// ActivityTimer gets updated as soon as there is a payload. +// Copy dumps all payload from reader to writer or stops when an error occurs. It returns nil when EOF. func Copy(reader Reader, writer Writer, options ...CopyOption) error { handler := new(copyHandler) for _, option := range options { From dd159cce6caed9b3249019da59aca290b6569bdb Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Tue, 21 Nov 2017 18:46:28 +0100 Subject: [PATCH 163/229] special handling for IPv6 from URL --- common/net/address.go | 6 ++++++ common/net/address_test.go | 12 ++++++++++++ 2 files changed, 18 insertions(+) diff --git a/common/net/address.go b/common/net/address.go index 583cebf8..993bf814 100644 --- a/common/net/address.go +++ b/common/net/address.go @@ -73,6 +73,12 @@ type Address interface { // ParseAddress parses a string into an Address. The return value will be an IPAddress when // the string is in the form of IPv4 or IPv6 address, or a DomainAddress otherwise. func ParseAddress(addr string) Address { + // Handle IPv6 address in form as "[2001:4860:0:2001::68]" + lenAddr := len(addr) + if lenAddr > 0 && addr[0] == '[' && addr[lenAddr-1] == ']' { + addr = addr[1 : lenAddr-1] + } + ip := net.ParseIP(addr) if ip != nil { return IPAddress(ip) diff --git a/common/net/address_test.go b/common/net/address_test.go index 3f5fcb42..2e8715c3 100644 --- a/common/net/address_test.go +++ b/common/net/address_test.go @@ -73,3 +73,15 @@ func TestNetIPv4Address(t *testing.T) { assert(addr, IsIPv4) assert(addr.String(), Equals, "1.2.3.4") } + +func TestParseIPv6Address(t *testing.T) { + assert := With(t) + + ip := ParseAddress("[2001:4860:0:2001::68]") + assert(ip, IsIPv6) + assert(ip.String(), Equals, "[2001:4860:0:2001::68]") + + ip = ParseAddress("[::ffff:123.151.71.143]") + assert(ip, IsIPv4) + assert(ip.String(), Equals, "123.151.71.143") +} From 97d886e1c9916ad09714f333802ac79c3a6bad58 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Tue, 21 Nov 2017 22:03:43 +0100 Subject: [PATCH 164/229] use all buffers --- common/crypto/auth.go | 7 ++----- common/crypto/auth_test.go | 2 +- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/common/crypto/auth.go b/common/crypto/auth.go index 28a7c68c..f6b96667 100644 --- a/common/crypto/auth.go +++ b/common/crypto/auth.go @@ -193,10 +193,6 @@ func (r *AuthenticationReader) ReadMultiBuffer() (buf.MultiBuffer, error) { return mb, nil } -const ( - WriteSize = 1024 -) - type AuthenticationWriter struct { auth Authenticator writer buf.Writer @@ -235,12 +231,13 @@ func (w *AuthenticationWriter) seal(b *buf.Buffer) (*buf.Buffer, error) { func (w *AuthenticationWriter) writeStream(mb buf.MultiBuffer) error { defer mb.Release() + payloadSize := buf.Size - w.auth.Overhead() - w.sizeParser.SizeBytes() mb2Write := buf.NewMultiBufferCap(len(mb) + 10) for { b := buf.New() common.Must(b.Reset(func(bb []byte) (int, error) { - return mb.Read(bb[:WriteSize]) + return mb.Read(bb[:payloadSize]) })) eb, err := w.seal(b) b.Release() diff --git a/common/crypto/auth_test.go b/common/crypto/auth_test.go index 4016dc51..58d256e4 100644 --- a/common/crypto/auth_test.go +++ b/common/crypto/auth_test.go @@ -43,7 +43,7 @@ func TestAuthenticationReaderWriter(t *testing.T) { }, PlainChunkSizeParser{}, cache, protocol.TransferTypeStream) assert(writer.WriteMultiBuffer(buf.NewMultiBufferValue(payload)), IsNil) - assert(cache.Len(), Equals, 83360) + assert(cache.Len(), Equals, 82658) assert(writer.WriteMultiBuffer(buf.MultiBuffer{}), IsNil) assert(err, IsNil) From bfafd06863af8df6e0e8cfad50510df58fb6f66f Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Wed, 22 Nov 2017 14:22:00 +0100 Subject: [PATCH 165/229] credits in readme --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 56e7a53b..c23b0016 100644 --- a/README.md +++ b/README.md @@ -21,3 +21,13 @@ V provides building blocks for network proxy development. Read our [Wiki](https: ## License [The MIT License (MIT)](https://raw.githubusercontent.com/v2ray/v2ray-core/master/LICENSE) + +## Credits + +This repo relies on the following third-party projects: + +* In production: + * [miekg/dns](https://github.com/miekg/dns) + * [gorilla/websocket](https://github.com/gorilla/websocket) +* For testing only: + * [h12w/socks](https://github.com/h12w/socks) From 6069b77baa88e9b0660422886fe4fd8b74bb6d57 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Wed, 22 Nov 2017 23:00:46 +0100 Subject: [PATCH 166/229] prototype for plugins --- common/platform/platform.go | 12 +++++++++ main/main.go | 8 ++++++ plugin.go | 53 +++++++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 plugin.go diff --git a/common/platform/platform.go b/common/platform/platform.go index fe9acdc7..b827cdc0 100644 --- a/common/platform/platform.go +++ b/common/platform/platform.go @@ -53,8 +53,20 @@ func getExecutableDir() string { return filepath.Dir(exec) } +func getExecuableSubDir(dir string) func() string { + return func() string { + return filepath.Join(getExecutableDir(), dir) + } +} + func GetAssetLocation(file string) string { const name = "v2ray.location.asset" assetPath := EnvFlag{Name: name, AltName: NormalizeEnvName(name)}.GetValue(getExecutableDir) return filepath.Join(assetPath, file) } + +func GetPluginDirectory() string { + const name = "v2ray.location.plugin" + pluginDir := EnvFlag{Name: name, AltName: NormalizeEnvName(name)}.GetValue(getExecuableSubDir("plugins")) + return pluginDir +} diff --git a/main/main.go b/main/main.go index de5bdb40..d6b52cf9 100644 --- a/main/main.go +++ b/main/main.go @@ -22,6 +22,7 @@ var ( version = flag.Bool("version", false, "Show current version of V2Ray.") test = flag.Bool("test", false, "Test config file only, without launching V2Ray server.") format = flag.String("format", "json", "Format of input file.") + plugin = flag.Bool("plugin", false, "True to load plugins.") ) func init() { @@ -82,6 +83,13 @@ func main() { return } + if *plugin { + if err := core.LoadPlugins(); err != nil { + fmt.Println("Failed to load plugins:", err.Error()) + return + } + } + server, err := startV2Ray() if err != nil { fmt.Println(err.Error()) diff --git a/plugin.go b/plugin.go new file mode 100644 index 00000000..dbd9b4c9 --- /dev/null +++ b/plugin.go @@ -0,0 +1,53 @@ +package core + +import ( + "os" + "path/filepath" + "plugin" + "strings" + + "v2ray.com/core/app/log" + "v2ray.com/core/common/platform" +) + +type PluginMetadata struct { + Name string +} + +const GetMetadataFuncName = "GetPluginMetadata" + +type GetMetadataFunc func() PluginMetadata + +func LoadPlugins() error { + pluginPath := platform.GetPluginDirectory() + + dir, err := os.Open(pluginPath) + if err != nil { + return err + } + defer dir.Close() + + files, err := dir.Readdir(-1) + if err != nil { + return err + } + + for _, file := range files { + if !file.IsDir() && strings.HasSuffix(file.Name(), ".so") { + p, err := plugin.Open(filepath.Join(pluginPath, file.Name())) + if err != nil { + return err + } + f, err := p.Lookup(GetMetadataFuncName) + if err != nil { + return err + } + if gmf, ok := f.(GetMetadataFunc); ok { + metadata := gmf() + log.Trace(newError("plugin (", metadata.Name, ") loaded.")) + } + } + } + + return nil +} From 9db6c187c689a4c066adbc05060e71b3c187b3e9 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Wed, 22 Nov 2017 23:11:32 +0100 Subject: [PATCH 167/229] load plugin only in linux --- plugin.go | 44 -------------------------------------------- plugin_linux.go | 47 +++++++++++++++++++++++++++++++++++++++++++++++ plugin_other.go | 7 +++++++ 3 files changed, 54 insertions(+), 44 deletions(-) create mode 100644 plugin_linux.go create mode 100644 plugin_other.go diff --git a/plugin.go b/plugin.go index dbd9b4c9..6d942a7e 100644 --- a/plugin.go +++ b/plugin.go @@ -1,15 +1,5 @@ package core -import ( - "os" - "path/filepath" - "plugin" - "strings" - - "v2ray.com/core/app/log" - "v2ray.com/core/common/platform" -) - type PluginMetadata struct { Name string } @@ -17,37 +7,3 @@ type PluginMetadata struct { const GetMetadataFuncName = "GetPluginMetadata" type GetMetadataFunc func() PluginMetadata - -func LoadPlugins() error { - pluginPath := platform.GetPluginDirectory() - - dir, err := os.Open(pluginPath) - if err != nil { - return err - } - defer dir.Close() - - files, err := dir.Readdir(-1) - if err != nil { - return err - } - - for _, file := range files { - if !file.IsDir() && strings.HasSuffix(file.Name(), ".so") { - p, err := plugin.Open(filepath.Join(pluginPath, file.Name())) - if err != nil { - return err - } - f, err := p.Lookup(GetMetadataFuncName) - if err != nil { - return err - } - if gmf, ok := f.(GetMetadataFunc); ok { - metadata := gmf() - log.Trace(newError("plugin (", metadata.Name, ") loaded.")) - } - } - } - - return nil -} diff --git a/plugin_linux.go b/plugin_linux.go new file mode 100644 index 00000000..ae595ba6 --- /dev/null +++ b/plugin_linux.go @@ -0,0 +1,47 @@ +// +build linux + +package core + +import ( + "os" + "path/filepath" + "plugin" + "strings" + + "v2ray.com/core/app/log" + "v2ray.com/core/common/platform" +) + +func LoadPlugins() error { + pluginPath := platform.GetPluginDirectory() + + dir, err := os.Open(pluginPath) + if err != nil { + return err + } + defer dir.Close() + + files, err := dir.Readdir(-1) + if err != nil { + return err + } + + for _, file := range files { + if !file.IsDir() && strings.HasSuffix(file.Name(), ".so") { + p, err := plugin.Open(filepath.Join(pluginPath, file.Name())) + if err != nil { + return err + } + f, err := p.Lookup(GetMetadataFuncName) + if err != nil { + return err + } + if gmf, ok := f.(GetMetadataFunc); ok { + metadata := gmf() + log.Trace(newError("plugin (", metadata.Name, ") loaded.")) + } + } + } + + return nil +} diff --git a/plugin_other.go b/plugin_other.go new file mode 100644 index 00000000..718be38f --- /dev/null +++ b/plugin_other.go @@ -0,0 +1,7 @@ +// +build !linux + +package core + +func LoadPlugins() error { + return nil +} From 40d7c4048977bc1f5da0a453672364dbcdb7c784 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Wed, 22 Nov 2017 23:15:14 +0100 Subject: [PATCH 168/229] comments --- plugin.go | 9 +++++++++ plugin_linux.go | 2 +- plugin_other.go | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/plugin.go b/plugin.go index 6d942a7e..8d4388e4 100644 --- a/plugin.go +++ b/plugin.go @@ -1,9 +1,18 @@ package core +// PluginMetadata contains some brief information regarding a plugin. type PluginMetadata struct { + // Name of the plugin Name string } +// GetMetadataFuncName is the name of the function in the plugin to return PluginMetadata. const GetMetadataFuncName = "GetPluginMetadata" +// GetMetadataFunc is the type of the function in the plugin to return PluginMetadata. type GetMetadataFunc func() PluginMetadata + +// LoadPlugins loads all possible plugins in the 'plugin' directory. +func LoadPlugins() error { + return loadPluginsInternal() +} diff --git a/plugin_linux.go b/plugin_linux.go index ae595ba6..72673b9e 100644 --- a/plugin_linux.go +++ b/plugin_linux.go @@ -12,7 +12,7 @@ import ( "v2ray.com/core/common/platform" ) -func LoadPlugins() error { +func loadPluginsInternal() error { pluginPath := platform.GetPluginDirectory() dir, err := os.Open(pluginPath) diff --git a/plugin_other.go b/plugin_other.go index 718be38f..183869a6 100644 --- a/plugin_other.go +++ b/plugin_other.go @@ -2,6 +2,6 @@ package core -func LoadPlugins() error { +func loadPluginsInternal() error { return nil } From 026f7e3cc2f0e9689d79d739529159e7163310be Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Wed, 22 Nov 2017 23:17:32 +0100 Subject: [PATCH 169/229] fix lint warning --- v2ray.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/v2ray.go b/v2ray.go index ffbb0a56..06baa2e5 100644 --- a/v2ray.go +++ b/v2ray.go @@ -109,14 +109,13 @@ func newSimpleServer(config *Config) (*simpleServer, error) { common.Must(space.AddApplication(d)) } - disp := dispatcher.FromSpace(space) - if disp == nil { + if disp := dispatcher.FromSpace(space); disp == nil { d, err := app.CreateAppFromConfig(ctx, new(dispatcher.Config)) if err != nil { return nil, err } common.Must(space.AddApplication(d)) - disp = d.(dispatcher.Interface) + // disp = d.(dispatcher.Interface) } for _, inbound := range config.Inbound { From 47126cc63225d3e2268e12f81691a10e09a4347b Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Thu, 23 Nov 2017 10:39:40 +0100 Subject: [PATCH 170/229] exit immediately on error --- main/main.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/main/main.go b/main/main.go index d6b52cf9..9b4cfcc4 100644 --- a/main/main.go +++ b/main/main.go @@ -86,23 +86,24 @@ func main() { if *plugin { if err := core.LoadPlugins(); err != nil { fmt.Println("Failed to load plugins:", err.Error()) - return + os.Exit(-1) } } server, err := startV2Ray() if err != nil { fmt.Println(err.Error()) - return + os.Exit(-1) } if *test { fmt.Println("Configuration OK.") - return + os.Exit(0) } if err := server.Start(); err != nil { fmt.Println("Failed to start", err) + os.Exit(-1) } osSignals := make(chan os.Signal, 1) From 6017e46af405dbe6ac1cd5d6bbb7d7eb01c4dbfd Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Thu, 23 Nov 2017 10:41:02 +0100 Subject: [PATCH 171/229] comments --- common/common.go | 1 + 1 file changed, 1 insertion(+) diff --git a/common/common.go b/common/common.go index 47d47dbd..36b65490 100644 --- a/common/common.go +++ b/common/common.go @@ -11,6 +11,7 @@ func Must(err error) { } } +// Must2 panics if the second parameter is not nil. func Must2(v interface{}, err error) { if err != nil { panic(err) From 619f4eae596fbc07a98e6e6432933a48ef9f4f38 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Thu, 23 Nov 2017 12:07:03 +0100 Subject: [PATCH 172/229] remove vpndialer from core. will be added through plugin --- app/vpndialer/config.pb.go | 52 ------ app/vpndialer/config.proto | 11 -- app/vpndialer/unix/errors.generated.go | 7 - app/vpndialer/unix/unix.go | 217 ------------------------- app/vpndialer/vpndialer.go | 1 - 5 files changed, 288 deletions(-) delete mode 100644 app/vpndialer/config.pb.go delete mode 100644 app/vpndialer/config.proto delete mode 100644 app/vpndialer/unix/errors.generated.go delete mode 100644 app/vpndialer/unix/unix.go delete mode 100644 app/vpndialer/vpndialer.go diff --git a/app/vpndialer/config.pb.go b/app/vpndialer/config.pb.go deleted file mode 100644 index f2cc5e9e..00000000 --- a/app/vpndialer/config.pb.go +++ /dev/null @@ -1,52 +0,0 @@ -package vpndialer - -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package - -type Config struct { - Address string `protobuf:"bytes,1,opt,name=address" json:"address,omitempty"` -} - -func (m *Config) Reset() { *m = Config{} } -func (m *Config) String() string { return proto.CompactTextString(m) } -func (*Config) ProtoMessage() {} -func (*Config) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } - -func (m *Config) GetAddress() string { - if m != nil { - return m.Address - } - return "" -} - -func init() { - proto.RegisterType((*Config)(nil), "v2ray.core.app.vpndialer.Config") -} - -func init() { proto.RegisterFile("v2ray.com/core/app/vpndialer/config.proto", fileDescriptor0) } - -var fileDescriptor0 = []byte{ - // 150 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0x2c, 0x33, 0x2a, 0x4a, - 0xac, 0xd4, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0x2f, 0x4a, 0xd5, 0x4f, 0x2c, 0x28, 0xd0, 0x2f, - 0x2b, 0xc8, 0x4b, 0xc9, 0x4c, 0xcc, 0x49, 0x2d, 0xd2, 0x4f, 0xce, 0xcf, 0x4b, 0xcb, 0x4c, 0xd7, - 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, 0x80, 0x29, 0x2d, 0x4a, 0xd5, 0x4b, 0x2c, 0x28, 0xd0, - 0x83, 0x2b, 0x53, 0x52, 0xe2, 0x62, 0x73, 0x06, 0xab, 0x14, 0x92, 0xe0, 0x62, 0x4f, 0x4c, 0x49, - 0x29, 0x4a, 0x2d, 0x2e, 0x96, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x0c, 0x82, 0x71, 0x9d, 0xdc, 0xb8, - 0x64, 0x92, 0xf3, 0x73, 0xf5, 0x70, 0x99, 0x11, 0xc0, 0x18, 0xc5, 0x09, 0xe7, 0xac, 0x62, 0x92, - 0x08, 0x33, 0x0a, 0x4a, 0xac, 0xd4, 0x73, 0x06, 0xa9, 0x73, 0x2c, 0x28, 0xd0, 0x0b, 0x2b, 0xc8, - 0x73, 0x01, 0x4b, 0x25, 0xb1, 0x81, 0x1d, 0x63, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, 0x97, 0xfc, - 0x09, 0x70, 0xb9, 0x00, 0x00, 0x00, -} diff --git a/app/vpndialer/config.proto b/app/vpndialer/config.proto deleted file mode 100644 index b5b801fb..00000000 --- a/app/vpndialer/config.proto +++ /dev/null @@ -1,11 +0,0 @@ -syntax = "proto3"; - -package v2ray.core.app.vpndialer; -option csharp_namespace = "V2Ray.Core.App.VpnDialer"; -option go_package = "vpndialer"; -option java_package = "com.v2ray.core.app.vpndialer"; -option java_multiple_files = true; - -message Config { - string address = 1; -} diff --git a/app/vpndialer/unix/errors.generated.go b/app/vpndialer/unix/errors.generated.go deleted file mode 100644 index d5873901..00000000 --- a/app/vpndialer/unix/errors.generated.go +++ /dev/null @@ -1,7 +0,0 @@ -package unix - -import "v2ray.com/core/common/errors" - -func newError(values ...interface{}) *errors.Error { - return errors.New(values...).Path("App", "VPNDialer", "Unix") -} diff --git a/app/vpndialer/unix/unix.go b/app/vpndialer/unix/unix.go deleted file mode 100644 index 47e9906f..00000000 --- a/app/vpndialer/unix/unix.go +++ /dev/null @@ -1,217 +0,0 @@ -package unix - -import ( - "context" - "os" - "sync" - - "golang.org/x/sys/unix" - "v2ray.com/core/app/vpndialer" - "v2ray.com/core/common" - "v2ray.com/core/common/net" - "v2ray.com/core/common/serial" - "v2ray.com/core/transport/internet" -) - -//go:generate go run $GOPATH/src/v2ray.com/core/tools/generrorgen/main.go -pkg unix -path App,VPNDialer,Unix - -type status int - -const ( - statusNew status = iota - statusOK - statusFail -) - -type fdStatus struct { - status status - fd int - callback chan<- error -} - -type protector struct { - sync.Mutex - address string - conn *net.UnixConn - status chan fdStatus -} - -func readFrom(conn *net.UnixConn, schan chan<- fdStatus) { - var payload [6]byte - for { - _, err := conn.Read(payload[:]) - if err != nil { - break - } - fd := serial.BytesToInt(payload[1:5]) - s := status(payload[5]) - schan <- fdStatus{ - fd: fd, - status: s, - } - } -} - -func (m *protector) dial() (*net.UnixConn, error) { - m.Lock() - defer m.Unlock() - - if m.conn != nil { - return m.conn, nil - } - - conn, err := net.DialUnix("unix", nil, &net.UnixAddr{ - Name: m.address, - Net: "unix", - }) - if err != nil { - return nil, err - } - m.conn = conn - m.status = make(chan fdStatus, 32) - go readFrom(conn, m.status) - go m.monitor(conn) - return conn, nil -} - -func (m *protector) close() { - m.Lock() - defer m.Unlock() - if m.conn == nil { - return - } - m.conn.Close() - m.conn = nil -} - -func (m *protector) monitor(c *net.UnixConn) { - pendingFd := make(map[int]chan<- error, 32) - for s := range m.status { - switch s.status { - case statusNew: - pendingFd[s.fd] = s.callback - case statusOK: - if c, f := pendingFd[s.fd]; f { - close(c) - delete(pendingFd, s.fd) - } - case statusFail: - if c, f := pendingFd[s.fd]; f { - c <- newError("failed to protect fd") - close(c) - delete(pendingFd, s.fd) - } - } - } -} - -func (m *protector) protect(fd int) error { - conn, err := m.dial() - if err != nil { - return err - } - - var payload [6]byte - serial.IntToBytes(fd, payload[1:1]) - payload[5] = byte(statusNew) - if _, err := conn.Write(payload[:]); err != nil { - return err - } - - wait := make(chan error) - m.status <- fdStatus{ - status: statusNew, - fd: fd, - callback: wait, - } - return <-wait -} - -type App struct { - protector *protector - dialer *Dialer -} - -func NewApp(ctx context.Context, config *vpndialer.Config) (*App, error) { - a := &App{ - dialer: &Dialer{}, - protector: &protector{ - address: config.Address, - }, - } - a.dialer.protect = a.protector.protect - return a, nil -} - -func (*App) Interface() interface{} { - return (*App)(nil) -} - -func (a *App) Start() error { - internet.UseAlternativeSystemDialer(a.dialer) - return nil -} - -func (a *App) Close() { - internet.UseAlternativeSystemDialer(nil) -} - -type Dialer struct { - protect func(fd int) error -} - -func socket(dest net.Destination) (int, error) { - switch dest.Network { - case net.Network_TCP: - return unix.Socket(unix.AF_INET6, unix.SOCK_STREAM, unix.IPPROTO_TCP) - case net.Network_UDP: - return unix.Socket(unix.AF_INET6, unix.SOCK_DGRAM, unix.IPPROTO_UDP) - default: - return 0, newError("unknown network ", dest.Network) - } -} - -func getIP(addr net.Address) (net.IP, error) { - if addr.Family().Either(net.AddressFamilyIPv4, net.AddressFamilyIPv6) { - return addr.IP(), nil - } - ips, err := net.LookupIP(addr.Domain()) - if err != nil { - return nil, err - } - return ips[0], nil -} - -func (d *Dialer) Dial(ctx context.Context, source net.Address, dest net.Destination) (net.Conn, error) { - fd, err := socket(dest) - if err != nil { - return nil, err - } - if err := d.protect(fd); err != nil { - return nil, err - } - - ip, err := getIP(dest.Address) - if err != nil { - return nil, err - } - - addr := &unix.SockaddrInet6{ - Port: int(dest.Port), - ZoneId: 0, - } - copy(addr.Addr[:], ip.To16()) - - if err := unix.Connect(fd, addr); err != nil { - return nil, err - } - - file := os.NewFile(uintptr(fd), "Socket") - return net.FileConn(file) -} - -func init() { - common.Must(common.RegisterConfig((*vpndialer.Config)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { - return NewApp(ctx, config.(*vpndialer.Config)) - })) -} diff --git a/app/vpndialer/vpndialer.go b/app/vpndialer/vpndialer.go deleted file mode 100644 index a4a3ea92..00000000 --- a/app/vpndialer/vpndialer.go +++ /dev/null @@ -1 +0,0 @@ -package vpndialer From 1226f3ce39f5e65d5f7433284099fd74c8db2435 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Thu, 23 Nov 2017 14:48:43 +0100 Subject: [PATCH 173/229] more test cases --- app/dispatcher/impl/sniffer_test.go | 8 ++++++++ common/net/address_test.go | 16 ++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/app/dispatcher/impl/sniffer_test.go b/app/dispatcher/impl/sniffer_test.go index ce252de4..9ae7eac8 100644 --- a/app/dispatcher/impl/sniffer_test.go +++ b/app/dispatcher/impl/sniffer_test.go @@ -3,6 +3,8 @@ package impl_test import ( "testing" + "v2ray.com/core/app/proxyman" + . "v2ray.com/core/app/dispatcher/impl" . "v2ray.com/ext/assert" ) @@ -184,3 +186,9 @@ func TestTLSHeaders(t *testing.T) { assert(err, Equals, test.err) } } + +func TestUnknownSniffer(t *testing.T) { + assert := With(t) + + assert(func() { NewSniffer([]proxyman.KnownProtocols{proxyman.KnownProtocols(-1)}) }, Panics) +} diff --git a/common/net/address_test.go b/common/net/address_test.go index 2e8715c3..9c2ab9c8 100644 --- a/common/net/address_test.go +++ b/common/net/address_test.go @@ -85,3 +85,19 @@ func TestParseIPv6Address(t *testing.T) { assert(ip, IsIPv4) assert(ip.String(), Equals, "123.151.71.143") } + +func TestInvalidAddressConvertion(t *testing.T) { + assert := With(t) + + assert(func() { ParseAddress("8.8.8.8").Domain() }, Panics) + assert(func() { ParseAddress("2001:4860:0:2001::68").Domain() }, Panics) + assert(func() { ParseAddress("v2ray.com").IP() }, Panics) +} + +func TestIPOrDomain(t *testing.T) { + assert := With(t) + + assert(NewIPOrDomain(ParseAddress("v2ray.com")).AsAddress(), Equals, ParseAddress("v2ray.com")) + assert(NewIPOrDomain(ParseAddress("8.8.8.8")).AsAddress(), Equals, ParseAddress("8.8.8.8")) + assert(NewIPOrDomain(ParseAddress("2001:4860:0:2001::68")).AsAddress(), Equals, ParseAddress("2001:4860:0:2001::68")) +} From 0aa48e6c5a7799aa80ca3238208f2ed7d5716f49 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Thu, 23 Nov 2017 14:58:35 +0100 Subject: [PATCH 174/229] cancel immediately when timeout = 0 --- common/signal/timer.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/common/signal/timer.go b/common/signal/timer.go index 5c2407f7..bc2a0bd1 100644 --- a/common/signal/timer.go +++ b/common/signal/timer.go @@ -39,6 +39,11 @@ func (t *ActivityTimer) run() { case <-t.ctx.Done(): return case timeout := <-t.timeout: + if timeout == 0 { + t.cancel() + return + } + ticker.Stop() ticker = time.NewTicker(timeout) } From 4aa87be0f24125ab06d50a95c1dd92ff9e9f0259 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Thu, 23 Nov 2017 15:21:16 +0100 Subject: [PATCH 175/229] enable command mux --- proxy/vmess/outbound/outbound.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/proxy/vmess/outbound/outbound.go b/proxy/vmess/outbound/outbound.go index 0f538f06..3b6bde34 100644 --- a/proxy/vmess/outbound/outbound.go +++ b/proxy/vmess/outbound/outbound.go @@ -75,9 +75,9 @@ func (v *Handler) Process(ctx context.Context, outboundRay ray.OutboundRay, dial if target.Network == net.Network_UDP { command = protocol.RequestCommandUDP } - //if target.Address.Family().IsDomain() && target.Address.Domain() == "v1.mux.com" { - // command = protocol.RequestCommandMux - //} + if target.Address.Family().IsDomain() && target.Address.Domain() == "v1.mux.com" { + command = protocol.RequestCommandMux + } request := &protocol.RequestHeader{ Version: encoding.Version, User: rec.PickUser(), From 3ed16fad380603998f443068fac79a11b7fcd208 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Thu, 23 Nov 2017 15:21:57 +0100 Subject: [PATCH 176/229] enable pading for cfb --- proxy/vmess/encoding/client.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/proxy/vmess/encoding/client.go b/proxy/vmess/encoding/client.go index 4a6142d0..ba2d57e7 100644 --- a/proxy/vmess/encoding/client.go +++ b/proxy/vmess/encoding/client.go @@ -80,10 +80,6 @@ func (c *ClientSession) EncodeRequestHeader(header *protocol.RequestHeader, writ buffer.AppendBytes(c.responseHeader, byte(header.Option)) padingLen := dice.Roll(16) - if header.Security.Is(protocol.SecurityType_LEGACY) { - // Disable padding in legacy mode for a smooth transition. - padingLen = 0 - } security := byte(padingLen<<4) | byte(header.Security) buffer.AppendBytes(security, byte(0), byte(header.Command)) From cf97b8b4d042ab9e4e49a87e25916919f407cf70 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Thu, 23 Nov 2017 17:24:11 +0100 Subject: [PATCH 177/229] Update version --- core.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core.go b/core.go index b2bbb300..458f8ba2 100644 --- a/core.go +++ b/core.go @@ -18,7 +18,7 @@ import ( ) var ( - version = "2.51" + version = "2.52" build = "Custom" codename = "One for all" intro = "An unified platform for anti-censorship." From 2371617a22c2f1142f1f70183c0e4a344f919580 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Thu, 23 Nov 2017 23:46:46 +0100 Subject: [PATCH 178/229] fix lint warnings --- proxy/vmess/outbound/outbound.go | 6 +----- transport/internet/kcp/dialer.go | 3 +-- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/proxy/vmess/outbound/outbound.go b/proxy/vmess/outbound/outbound.go index 3b6bde34..c2d7fb7e 100644 --- a/proxy/vmess/outbound/outbound.go +++ b/proxy/vmess/outbound/outbound.go @@ -152,11 +152,7 @@ func (v *Handler) Process(ctx context.Context, outboundRay ray.OutboundRay, dial reader.SetBuffered(false) bodyReader := session.DecodeResponseBody(request, reader) - if err := buf.Copy(bodyReader, output, buf.UpdateActivity(timer)); err != nil { - return err - } - - return nil + return buf.Copy(bodyReader, output, buf.UpdateActivity(timer)) }) if err := signal.ErrorOrFinish2(ctx, requestDone, responseDone); err != nil { diff --git a/transport/internet/kcp/dialer.go b/transport/internet/kcp/dialer.go index 197586f1..73d9a90c 100644 --- a/transport/internet/kcp/dialer.go +++ b/transport/internet/kcp/dialer.go @@ -129,8 +129,7 @@ func DialKCP(ctx context.Context, dest net.Destination) (internet.Connection, er conv := uint16(atomic.AddUint32(&globalConv, 1)) session := NewConnection(conv, conn, kcpSettings) - var iConn internet.Connection - iConn = session + var iConn internet.Connection = session if securitySettings := internet.SecuritySettingsFromContext(ctx); securitySettings != nil { switch securitySettings := securitySettings.(type) { From d75f66ad3e9c18e91621dd6a18569282c14c0b54 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 24 Nov 2017 14:57:56 +0100 Subject: [PATCH 179/229] update issue template --- .github/ISSUE_TEMPLATE | 87 ++++++++++++++++++++++++++++++++---------- 1 file changed, 66 insertions(+), 21 deletions(-) diff --git a/.github/ISSUE_TEMPLATE b/.github/ISSUE_TEMPLATE index ab8178ea..4b99b0d1 100644 --- a/.github/ISSUE_TEMPLATE +++ b/.github/ISSUE_TEMPLATE @@ -1,44 +1,89 @@ -提交 Issue 之前请先阅读 [Issue 指引](https://www.v2ray.com/zh_cn/chapter_01/issue.html),然后回答下面的问题,谢谢。 -Please read the [instruction](https://www.v2ray.com/en/get_started/issue.html) and answer the following questions before submitting your issue. Thank you. +Please skip to the [English section](#english) if you don't write Chinese. + +#### 中文: +提交 Issue 之前请先阅读 [Issue 指引](https://www.v2ray.com/chapter_01/issue.html),然后回答下面的问题,谢谢。 +除非特殊情况,请完整填写所有问题,缺少信息将减慢Issue回复速度。 1) 你正在使用哪个版本的 V2Ray?(如果服务器和客户端使用了不同版本,请注明) - What version of V2Ray are you using (If you deploy different version on server and client, please explicitly point out)? 2) 你的使用场景是什么?比如使用 Chrome 通过 Socks/VMess 代理观看 YouTube 视频。 - What's your scenario of using V2Ray? E.g., Watching YouTube videos in Chrome via Socks/VMess proxy. -3) 你看到的不正常的现象是什么? - What did you see? +3) 你看到的不正常的现象是什么?(请描述具体现象,比如访问超时,TLS 证书错误等) 4) 你期待看到的正确表现是怎样的? - What's your expectation? -5) 请附上你的配置文件(提交 Issue 前请隐藏服务器端IP地址)。 - Please attach your configuration file (**Mask IP addresses before submit this issue**). - - Server Configuration File(服务器端配置文件): +5) 请附上你的配置(提交 Issue 前请隐藏服务器端IP地址)。 + + 服务器端配置: ```javascript // 在这里附上服务器端配置文件 - // Please attach your server configuration file here. ``` - Client Configuration File(客户端配置文件): + 客户端配置: ```javascript - // 在这里附上客户端配置文件 - // Please attach your client configuration file here. + // 在这里附上客户端配置 ``` -6) 请附上出错时软件输出的日志。在 Linux 中,日志通常在 `/var/log/v2ray/error.log` 文件中。 - Please attach the log file, especially the bottom lines if the file is large. Log file is usually `/var/log/v2ray/error.log` on Linux. +6) 请附上出错时软件输出的错误日志。在 Linux 中,日志通常在 `/var/log/v2ray/error.log` 文件中。 - Server Log File(服务器端日志): + 服务器端错误日志: ``` // 在这里附上服务器端日志 - // Please attach your server log here. ``` - Client Log File(客户端日志): + 客户端错误日志: ``` // 在这里附上客户端日志 - // Please attach your client log here. ``` + +7) 请附上访问日志。在 Linux 中,日志通常在 `/var/log/v2ray/error.log` 文件中。 +``` + // 在这里附上服务器端日志 +``` + +请预览一下你填的内容再提交。 + +如果你已经填完上面的问卷,请把下面的英文部份删除,再提交 Issue。 +Please remove the Chinese section above. + +#### English: +Please read the [instruction](https://www.v2ray.com/en/get_started/issue.html) and answer the following questions before submitting your issue. Thank you. +Please answer all the questions with enough information. Lack of information will delay response. + +1) What version of V2Ray are you using (If you deploy different version on server and client, please explicitly point out)? + +2) What's your scenario of using V2Ray? E.g., Watching YouTube videos in Chrome via Socks/VMess proxy. + +3) What did you see? (Please describe in detail, such as timeout, fake TLS certificate etc) + +4) What's your expectation? + +5) Please attach your configuration file (**Mask IP addresses before submit this issue**). + + Server configuration: +```javascript + // Please attach your server configuration here. +``` + + Client configuration: +```javascript + // Please attach your client configuration here. +``` + +6) Please attach error logs, especially the bottom lines if the file is large. Error log file is usually at `/var/log/v2ray/error.log` on Linux. + + Server error log: +``` + // Please attach your server error log here. +``` + Client error log: +``` + // Please attach your client error log here. +``` + +7) Please attach access log. Access log is usually at '/var/log/v2ray/access.log' on Linux. +``` + // Please attach your server access log here. +``` + +Please review your issue before submitting. From 96a7587164e2ae7947d41a8db9156d793d787f77 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 24 Nov 2017 14:59:18 +0100 Subject: [PATCH 180/229] remove unnecessary links --- .github/ISSUE_TEMPLATE | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/ISSUE_TEMPLATE b/.github/ISSUE_TEMPLATE index 4b99b0d1..4c6d4af7 100644 --- a/.github/ISSUE_TEMPLATE +++ b/.github/ISSUE_TEMPLATE @@ -1,6 +1,6 @@ -Please skip to the [English section](#english) if you don't write Chinese. +Please skip to the English section below if you don't write Chinese. -#### 中文: +中文: 提交 Issue 之前请先阅读 [Issue 指引](https://www.v2ray.com/chapter_01/issue.html),然后回答下面的问题,谢谢。 除非特殊情况,请完整填写所有问题,缺少信息将减慢Issue回复速度。 @@ -46,7 +46,7 @@ Please skip to the [English section](#english) if you don't write Chinese. 如果你已经填完上面的问卷,请把下面的英文部份删除,再提交 Issue。 Please remove the Chinese section above. -#### English: +English: Please read the [instruction](https://www.v2ray.com/en/get_started/issue.html) and answer the following questions before submitting your issue. Thank you. Please answer all the questions with enough information. Lack of information will delay response. From 2fdccb242441997762091dcceea8c772d7126a75 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 24 Nov 2017 23:16:01 +0100 Subject: [PATCH 181/229] handle read with data and error at same time --- common/buf/copy.go | 24 ++++++++--------- common/buf/reader.go | 54 ++++++++++++++++++++++++++------------- common/buf/writer.go | 29 +++++++++++++++------ common/buf/writer_test.go | 8 +++--- 4 files changed, 72 insertions(+), 43 deletions(-) diff --git a/common/buf/copy.go b/common/buf/copy.go index 654bf0a4..75e6408b 100644 --- a/common/buf/copy.go +++ b/common/buf/copy.go @@ -82,23 +82,19 @@ func CountSize(sc *SizeCounter) CopyOption { func copyInternal(reader Reader, writer Writer, handler *copyHandler) error { for { buffer, err := handler.readFrom(reader) + if !buffer.IsEmpty() { + for _, handler := range handler.onData { + handler(buffer) + } + + if werr := handler.writeTo(writer, buffer); werr != nil { + buffer.Release() + return werr + } + } if err != nil { return err } - - if buffer.IsEmpty() { - buffer.Release() - continue - } - - for _, handler := range handler.onData { - handler(buffer) - } - - if err := handler.writeTo(writer, buffer); err != nil { - buffer.Release() - return err - } } } diff --git a/common/buf/reader.go b/common/buf/reader.go index 8a327b3e..9b80e9bf 100644 --- a/common/buf/reader.go +++ b/common/buf/reader.go @@ -6,6 +6,11 @@ import ( "v2ray.com/core/common/errors" ) +var ( + _ Reader = (*BytesToBufferReader)(nil) + _ io.Reader = (*BytesToBufferReader)(nil) +) + // BytesToBufferReader is a Reader that adjusts its reading speed automatically. type BytesToBufferReader struct { io.Reader @@ -37,15 +42,21 @@ func (r *BytesToBufferReader) ReadMultiBuffer() (MultiBuffer, error) { } nBytes, err := r.Reader.Read(r.buffer) - if err != nil { - return nil, err + if nBytes > 0 { + mb := NewMultiBufferCap(nBytes/Size + 1) + mb.Write(r.buffer[:nBytes]) + return mb, err } - - mb := NewMultiBufferCap(nBytes/Size + 1) - mb.Write(r.buffer[:nBytes]) - return mb, nil + return nil, err } +var ( + _ Reader = (*BufferedReader)(nil) + _ io.Reader = (*BufferedReader)(nil) + _ io.ByteReader = (*BufferedReader)(nil) + _ io.WriterTo = (*BufferedReader)(nil) +) + type BufferedReader struct { stream Reader legacyReader io.Reader @@ -72,6 +83,12 @@ func (r *BufferedReader) IsBuffered() bool { return r.buffered } +func (r *BufferedReader) ReadByte() (byte, error) { + var b [1]byte + _, err := r.Read(b[:]) + return b[0], err +} + func (r *BufferedReader) Read(b []byte) (int, error) { if r.leftOver != nil { nBytes, _ := r.leftOver.Read(b) @@ -87,15 +104,14 @@ func (r *BufferedReader) Read(b []byte) (int, error) { } mb, err := r.stream.ReadMultiBuffer() - if err != nil { - return 0, err + if mb != nil { + nBytes, _ := mb.Read(b) + if !mb.IsEmpty() { + r.leftOver = mb + } + return nBytes, err } - - nBytes, _ := mb.Read(b) - if !mb.IsEmpty() { - r.leftOver = mb - } - return nBytes, nil + return 0, err } func (r *BufferedReader) ReadMultiBuffer() (MultiBuffer, error) { @@ -120,11 +136,13 @@ func (r *BufferedReader) writeToInternal(writer io.Writer) (int64, error) { for { mb, err := r.stream.ReadMultiBuffer() - if err != nil { - return totalBytes, err + if mb != nil { + totalBytes += int64(mb.Len()) + if werr := mbWriter.WriteMultiBuffer(mb); werr != nil { + return totalBytes, err + } } - totalBytes += int64(mb.Len()) - if err := mbWriter.WriteMultiBuffer(mb); err != nil { + if err != nil { return totalBytes, err } } diff --git a/common/buf/writer.go b/common/buf/writer.go index f51fa3fb..8b10bb57 100644 --- a/common/buf/writer.go +++ b/common/buf/writer.go @@ -6,6 +6,12 @@ import ( "v2ray.com/core/common/errors" ) +var ( + _ io.ReaderFrom = (*BufferToBytesWriter)(nil) + _ io.Writer = (*BufferToBytesWriter)(nil) + _ Writer = (*BufferToBytesWriter)(nil) +) + // BufferToBytesWriter is a Writer that writes alloc.Buffer into underlying writer. type BufferToBytesWriter struct { io.Writer @@ -33,6 +39,13 @@ func (w *BufferToBytesWriter) ReadFrom(reader io.Reader) (int64, error) { return sc.Size, err } +var ( + _ io.ReaderFrom = (*BufferedWriter)(nil) + _ io.Writer = (*BufferedWriter)(nil) + _ Writer = (*BufferedWriter)(nil) + _ io.ByteWriter = (*BufferedWriter)(nil) +) + // BufferedWriter is a Writer with internal buffer. type BufferedWriter struct { writer Writer @@ -54,6 +67,11 @@ func NewBufferedWriter(writer Writer) *BufferedWriter { return w } +func (w *BufferedWriter) WriteByte(c byte) error { + _, err := w.Write([]byte{c}) + return err +} + // Write implements io.Writer. func (w *BufferedWriter) Write(b []byte) (int, error) { if !w.buffered && w.legacyWriter != nil { @@ -130,17 +148,12 @@ func (w *BufferedWriter) SetBuffered(f bool) error { // ReadFrom implements io.ReaderFrom. func (w *BufferedWriter) ReadFrom(reader io.Reader) (int64, error) { - var sc SizeCounter - if !w.buffer.IsEmpty() { - sc.Size += int64(w.buffer.Len()) - if err := w.Flush(); err != nil { - return sc.Size, err - } + if err := w.SetBuffered(false); err != nil { + return 0, err } - w.buffered = false + var sc SizeCounter err := Copy(NewReader(reader), w, CountSize(&sc)) - return sc.Size, err } diff --git a/common/buf/writer_test.go b/common/buf/writer_test.go index 3f64411d..0e6b15db 100644 --- a/common/buf/writer_test.go +++ b/common/buf/writer_test.go @@ -37,15 +37,17 @@ func TestBytesWriterReadFrom(t *testing.T) { assert := With(t) cache := ray.NewStream(context.Background()) - reader := bufio.NewReader(io.LimitReader(rand.Reader, 8192)) + const size = 50000 + reader := bufio.NewReader(io.LimitReader(rand.Reader, size)) writer := NewBufferedWriter(cache) writer.SetBuffered(false) - _, err := reader.WriteTo(writer) + nBytes, err := reader.WriteTo(writer) + assert(nBytes, Equals, int64(size)) assert(err, IsNil) mb, err := cache.ReadMultiBuffer() assert(err, IsNil) - assert(mb.Len(), Equals, 8192) + assert(mb.Len(), Equals, size) } func TestDiscardBytes(t *testing.T) { From 74327ea8aec3b23ec43a5c3f944d7c8877266615 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 24 Nov 2017 23:24:12 +0100 Subject: [PATCH 182/229] prevent using net.Conn.WriteTo() --- proxy/http/server.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/proxy/http/server.go b/proxy/http/server.go index ab96f731..5d472d66 100644 --- a/proxy/http/server.go +++ b/proxy/http/server.go @@ -86,8 +86,12 @@ func parseBasicAuth(auth string) (username, password string, ok bool) { return cs[:s], cs[s+1:], true } +type readerOnly struct { + io.Reader +} + func (s *Server) Process(ctx context.Context, network net.Network, conn internet.Connection, dispatcher dispatcher.Interface) error { - reader := bufio.NewReaderSize(conn, buf.Size) + reader := bufio.NewReaderSize(readerOnly{conn}, buf.Size) Start: conn.SetReadDeadline(time.Now().Add(time.Second * 16)) From 6de4ef014ac03933894fdd47aeaf08fcad058590 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sat, 25 Nov 2017 01:05:30 +0100 Subject: [PATCH 183/229] read directly from underlying buffered reader in mux --- app/proxyman/mux/mux.go | 20 ++++++++++---------- app/proxyman/mux/reader.go | 28 +++++----------------------- app/proxyman/mux/session.go | 3 +-- common/buf/multi_buffer.go | 5 +++++ common/buf/reader.go | 14 ++++++++++++++ 5 files changed, 35 insertions(+), 35 deletions(-) diff --git a/app/proxyman/mux/mux.go b/app/proxyman/mux/mux.go index 5470a293..fb44919a 100644 --- a/app/proxyman/mux/mux.go +++ b/app/proxyman/mux/mux.go @@ -192,25 +192,25 @@ func (m *Client) Dispatch(ctx context.Context, outboundRay ray.OutboundRay) bool return true } -func drain(reader io.Reader) error { +func drain(reader *buf.BufferedReader) error { return buf.Copy(NewStreamReader(reader), buf.Discard) } -func (m *Client) handleStatueKeepAlive(meta *FrameMetadata, reader io.Reader) error { +func (m *Client) handleStatueKeepAlive(meta *FrameMetadata, reader *buf.BufferedReader) error { if meta.Option.Has(OptionData) { return drain(reader) } return nil } -func (m *Client) handleStatusNew(meta *FrameMetadata, reader io.Reader) error { +func (m *Client) handleStatusNew(meta *FrameMetadata, reader *buf.BufferedReader) error { if meta.Option.Has(OptionData) { return drain(reader) } return nil } -func (m *Client) handleStatusKeep(meta *FrameMetadata, reader io.Reader) error { +func (m *Client) handleStatusKeep(meta *FrameMetadata, reader *buf.BufferedReader) error { if !meta.Option.Has(OptionData) { return nil } @@ -221,7 +221,7 @@ func (m *Client) handleStatusKeep(meta *FrameMetadata, reader io.Reader) error { return drain(reader) } -func (m *Client) handleStatusEnd(meta *FrameMetadata, reader io.Reader) error { +func (m *Client) handleStatusEnd(meta *FrameMetadata, reader *buf.BufferedReader) error { if s, found := m.sessionManager.Get(meta.SessionID); found { s.Close() } @@ -315,14 +315,14 @@ func handle(ctx context.Context, s *Session, output buf.Writer) { s.Close() } -func (w *ServerWorker) handleStatusKeepAlive(meta *FrameMetadata, reader io.Reader) error { +func (w *ServerWorker) handleStatusKeepAlive(meta *FrameMetadata, reader *buf.BufferedReader) error { if meta.Option.Has(OptionData) { return drain(reader) } return nil } -func (w *ServerWorker) handleStatusNew(ctx context.Context, meta *FrameMetadata, reader io.Reader) error { +func (w *ServerWorker) handleStatusNew(ctx context.Context, meta *FrameMetadata, reader *buf.BufferedReader) error { log.Trace(newError("received request for ", meta.Target)) inboundRay, err := w.dispatcher.Dispatch(ctx, meta.Target) if err != nil { @@ -349,7 +349,7 @@ func (w *ServerWorker) handleStatusNew(ctx context.Context, meta *FrameMetadata, return nil } -func (w *ServerWorker) handleStatusKeep(meta *FrameMetadata, reader io.Reader) error { +func (w *ServerWorker) handleStatusKeep(meta *FrameMetadata, reader *buf.BufferedReader) error { if !meta.Option.Has(OptionData) { return nil } @@ -359,7 +359,7 @@ func (w *ServerWorker) handleStatusKeep(meta *FrameMetadata, reader io.Reader) e return drain(reader) } -func (w *ServerWorker) handleStatusEnd(meta *FrameMetadata, reader io.Reader) error { +func (w *ServerWorker) handleStatusEnd(meta *FrameMetadata, reader *buf.BufferedReader) error { if s, found := w.sessionManager.Get(meta.SessionID); found { s.Close() } @@ -369,7 +369,7 @@ func (w *ServerWorker) handleStatusEnd(meta *FrameMetadata, reader io.Reader) er return nil } -func (w *ServerWorker) handleFrame(ctx context.Context, reader io.Reader) error { +func (w *ServerWorker) handleFrame(ctx context.Context, reader *buf.BufferedReader) error { meta, err := ReadMetadata(reader) if err != nil { return newError("failed to read metadata").Base(err) diff --git a/app/proxyman/mux/reader.go b/app/proxyman/mux/reader.go index 80192dc9..df13ed2b 100644 --- a/app/proxyman/mux/reader.go +++ b/app/proxyman/mux/reader.go @@ -67,12 +67,12 @@ func (r *PacketReader) ReadMultiBuffer() (buf.MultiBuffer, error) { // StreamReader reads Mux frame as a stream. type StreamReader struct { - reader io.Reader + reader *buf.BufferedReader leftOver int } // NewStreamReader creates a new StreamReader. -func NewStreamReader(reader io.Reader) *StreamReader { +func NewStreamReader(reader *buf.BufferedReader) *StreamReader { return &StreamReader{ reader: reader, leftOver: -1, @@ -94,25 +94,7 @@ func (r *StreamReader) ReadMultiBuffer() (buf.MultiBuffer, error) { r.leftOver = int(size) } - mb := buf.NewMultiBufferCap(32) - for r.leftOver > 0 { - readLen := buf.Size - if r.leftOver < readLen { - readLen = r.leftOver - } - b := buf.New() - if err := b.AppendSupplier(func(bb []byte) (int, error) { - return r.reader.Read(bb[:readLen]) - }); err != nil { - b.Release() - mb.Release() - return nil, err - } - r.leftOver -= b.Len() - mb.Append(b) - if b.Len() < readLen { - break - } - } - return mb, nil + mb, err := r.reader.ReadAtMost(r.leftOver) + r.leftOver -= mb.Len() + return mb, err } diff --git a/app/proxyman/mux/session.go b/app/proxyman/mux/session.go index 8704a0d4..66e1b729 100644 --- a/app/proxyman/mux/session.go +++ b/app/proxyman/mux/session.go @@ -1,7 +1,6 @@ package mux import ( - "io" "sync" "v2ray.com/core/common/buf" @@ -139,7 +138,7 @@ func (s *Session) Close() { } // NewReader creates a buf.Reader based on the transfer type of this Session. -func (s *Session) NewReader(reader io.Reader) buf.Reader { +func (s *Session) NewReader(reader *buf.BufferedReader) buf.Reader { if s.transferType == protocol.TransferTypeStream { return NewStreamReader(reader) } diff --git a/common/buf/multi_buffer.go b/common/buf/multi_buffer.go index b2814e5f..2c8e9585 100644 --- a/common/buf/multi_buffer.go +++ b/common/buf/multi_buffer.go @@ -166,6 +166,11 @@ func (mb *MultiBuffer) SliceBySize(size int) MultiBuffer { (*mb)[i] = nil } *mb = (*mb)[endIndex:] + if endIndex == 0 && len(*mb) > 0 { + b := New() + common.Must(b.Reset(ReadFullFrom((*mb)[0], size))) + return NewMultiBufferValue(b) + } return slice } diff --git a/common/buf/reader.go b/common/buf/reader.go index 9b80e9bf..124e3e3a 100644 --- a/common/buf/reader.go +++ b/common/buf/reader.go @@ -124,6 +124,20 @@ func (r *BufferedReader) ReadMultiBuffer() (MultiBuffer, error) { return r.stream.ReadMultiBuffer() } +// ReadAtMost returns a MultiBuffer with at most size. +func (r *BufferedReader) ReadAtMost(size int) (mb MultiBuffer, err error) { + if r.leftOver == nil { + r.leftOver, err = r.stream.ReadMultiBuffer() + } + if r.leftOver != nil { + mb = r.leftOver.SliceBySize(size) + if r.leftOver.IsEmpty() { + r.leftOver = nil + } + } + return +} + func (r *BufferedReader) writeToInternal(writer io.Writer) (int64, error) { mbWriter := NewWriter(writer) totalBytes := int64(0) From 25dd73928561477128770045b8cbf494f290fb0d Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sat, 25 Nov 2017 15:20:59 +0100 Subject: [PATCH 184/229] refactor --- proxy/vmess/inbound/config.go | 6 +++--- proxy/vmess/inbound/inbound.go | 28 ++++++++++++++-------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/proxy/vmess/inbound/config.go b/proxy/vmess/inbound/config.go index 5d9f94ea..37e717ba 100644 --- a/proxy/vmess/inbound/config.go +++ b/proxy/vmess/inbound/config.go @@ -1,12 +1,12 @@ package inbound // GetDefaultValue returns default settings of DefaultConfig. -func (v *Config) GetDefaultValue() *DefaultConfig { - if v.GetDefault() == nil { +func (c *Config) GetDefaultValue() *DefaultConfig { + if c.GetDefault() == nil { return &DefaultConfig{ AlterId: 32, Level: 0, } } - return v.Default + return c.Default } diff --git a/proxy/vmess/inbound/inbound.go b/proxy/vmess/inbound/inbound.go index 4e268a66..847ce549 100644 --- a/proxy/vmess/inbound/inbound.go +++ b/proxy/vmess/inbound/inbound.go @@ -33,7 +33,7 @@ type userByEmail struct { defaultAlterIDs uint16 } -func NewUserByEmail(users []*protocol.User, config *DefaultConfig) *userByEmail { +func newUserByEmail(users []*protocol.User, config *DefaultConfig) *userByEmail { cache := make(map[string]*protocol.User) for _, user := range users { cache[user.Email] = user @@ -80,6 +80,7 @@ type Handler struct { sessionHistory *encoding.SessionHistory } +// New creates a new VMess inbound handler. func New(ctx context.Context, config *Config) (*Handler, error) { space := app.SpaceFromContext(ctx) if space == nil { @@ -96,7 +97,7 @@ func New(ctx context.Context, config *Config) (*Handler, error) { handler := &Handler{ clients: allowedClients, detours: config.Detour, - usersByEmail: NewUserByEmail(config.User, config.GetDefaultValue()), + usersByEmail: newUserByEmail(config.User, config.GetDefaultValue()), sessionHistory: encoding.NewSessionHistory(ctx), } @@ -118,10 +119,10 @@ func (*Handler) Network() net.NetworkList { } } -func (v *Handler) GetUser(email string) *protocol.User { - user, existing := v.usersByEmail.Get(email) +func (h *Handler) GetUser(email string) *protocol.User { + user, existing := h.usersByEmail.Get(email) if !existing { - v.clients.Add(user) + h.clients.Add(user) } return user } @@ -172,14 +173,14 @@ func transferResponse(timer signal.ActivityUpdater, session *encoding.ServerSess } // Process implements proxy.Inbound.Process(). -func (v *Handler) Process(ctx context.Context, network net.Network, connection internet.Connection, dispatcher dispatcher.Interface) error { +func (h *Handler) Process(ctx context.Context, network net.Network, connection internet.Connection, dispatcher dispatcher.Interface) error { if err := connection.SetReadDeadline(time.Now().Add(time.Second * 8)); err != nil { return newError("unable to set read deadline").Base(err).AtWarning() } reader := buf.NewBufferedReader(buf.NewReader(connection)) - session := encoding.NewServerSession(v.clients, v.sessionHistory) + session := encoding.NewServerSession(h.clients, h.sessionHistory) request, err := session.DecodeRequestHeader(reader) if err != nil { @@ -203,7 +204,6 @@ func (v *Handler) Process(ctx context.Context, network net.Network, connection i } userSettings := request.User.GetSettings() - ctx = protocol.ContextWithUser(ctx, request.User) ctx, cancel := context.WithCancel(ctx) @@ -225,7 +225,7 @@ func (v *Handler) Process(ctx context.Context, network net.Network, connection i defer writer.Flush() response := &protocol.ResponseHeader{ - Command: v.generateCommand(ctx, request), + Command: h.generateCommand(ctx, request), } return transferResponse(timer, session, request, response, output, writer) }) @@ -239,11 +239,11 @@ func (v *Handler) Process(ctx context.Context, network net.Network, connection i return nil } -func (v *Handler) generateCommand(ctx context.Context, request *protocol.RequestHeader) protocol.ResponseCommand { - if v.detours != nil { - tag := v.detours.To - if v.inboundHandlerManager != nil { - handler, err := v.inboundHandlerManager.GetHandler(ctx, tag) +func (h *Handler) generateCommand(ctx context.Context, request *protocol.RequestHeader) protocol.ResponseCommand { + if h.detours != nil { + tag := h.detours.To + if h.inboundHandlerManager != nil { + handler, err := h.inboundHandlerManager.GetHandler(ctx, tag) if err != nil { log.Trace(newError("failed to get detour handler: ", tag, err).AtWarning()) return nil From 052d2d82781915a273c681713cff4aa418ea8505 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sat, 25 Nov 2017 21:35:26 +0100 Subject: [PATCH 185/229] merge noOpBytesWriter into noOpWriter --- common/buf/writer.go | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/common/buf/writer.go b/common/buf/writer.go index 8b10bb57..a6bada13 100644 --- a/common/buf/writer.go +++ b/common/buf/writer.go @@ -183,13 +183,11 @@ func (noOpWriter) WriteMultiBuffer(b MultiBuffer) error { return nil } -type noOpBytesWriter struct{} - -func (noOpBytesWriter) Write(b []byte) (int, error) { +func (noOpWriter) Write(b []byte) (int, error) { return len(b), nil } -func (noOpBytesWriter) ReadFrom(reader io.Reader) (int64, error) { +func (noOpWriter) ReadFrom(reader io.Reader) (int64, error) { b := New() defer b.Release() @@ -211,5 +209,5 @@ var ( Discard Writer = noOpWriter{} // DiscardBytes is an io.Writer that swallows all contents written in. - DiscardBytes io.Writer = noOpBytesWriter{} + DiscardBytes io.Writer = noOpWriter{} ) From 41961dbd603cd3ae30d01ce4c859d3a3f17ce5f6 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sat, 25 Nov 2017 21:58:47 +0100 Subject: [PATCH 186/229] cleanup --- common/buf/reader.go | 19 ++++++++----------- common/buf/writer.go | 19 ++++++++----------- 2 files changed, 16 insertions(+), 22 deletions(-) diff --git a/common/buf/reader.go b/common/buf/reader.go index 124e3e3a..632a0039 100644 --- a/common/buf/reader.go +++ b/common/buf/reader.go @@ -58,21 +58,16 @@ var ( ) type BufferedReader struct { - stream Reader - legacyReader io.Reader - leftOver MultiBuffer - buffered bool + stream Reader + leftOver MultiBuffer + buffered bool } func NewBufferedReader(reader Reader) *BufferedReader { - r := &BufferedReader{ + return &BufferedReader{ stream: reader, buffered: true, } - if lr, ok := reader.(io.Reader); ok { - r.legacyReader = lr - } - return r } func (r *BufferedReader) SetBuffered(f bool) { @@ -99,8 +94,10 @@ func (r *BufferedReader) Read(b []byte) (int, error) { return nBytes, nil } - if !r.buffered && r.legacyReader != nil { - return r.legacyReader.Read(b) + if !r.buffered { + if reader, ok := r.stream.(io.Reader); ok { + return reader.Read(b) + } } mb, err := r.stream.ReadMultiBuffer() diff --git a/common/buf/writer.go b/common/buf/writer.go index a6bada13..6dbc886e 100644 --- a/common/buf/writer.go +++ b/common/buf/writer.go @@ -48,23 +48,18 @@ var ( // BufferedWriter is a Writer with internal buffer. type BufferedWriter struct { - writer Writer - legacyWriter io.Writer - buffer *Buffer - buffered bool + writer Writer + buffer *Buffer + buffered bool } // NewBufferedWriter creates a new BufferedWriter. func NewBufferedWriter(writer Writer) *BufferedWriter { - w := &BufferedWriter{ + return &BufferedWriter{ writer: writer, buffer: New(), buffered: true, } - if lw, ok := writer.(io.Writer); ok { - w.legacyWriter = lw - } - return w } func (w *BufferedWriter) WriteByte(c byte) error { @@ -74,8 +69,10 @@ func (w *BufferedWriter) WriteByte(c byte) error { // Write implements io.Writer. func (w *BufferedWriter) Write(b []byte) (int, error) { - if !w.buffered && w.legacyWriter != nil { - return w.legacyWriter.Write(b) + if !w.buffered { + if writer, ok := w.writer.(io.Writer); ok { + return writer.Write(b) + } } totalBytes := 0 From 713ebfb203b25f10de8db292a925af3de5cf1f5c Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 26 Nov 2017 00:51:54 +0100 Subject: [PATCH 187/229] implementation for Shadowsocks AEAD --- common/crypto/auth.go | 20 +++++++ common/crypto/chunk.go | 23 ++++++++ proxy/shadowsocks/client.go | 11 +--- proxy/shadowsocks/config.go | 107 ++++++++++++++++++++++++++++++---- proxy/shadowsocks/protocol.go | 61 +++++++++---------- 5 files changed, 173 insertions(+), 49 deletions(-) diff --git a/common/crypto/auth.go b/common/crypto/auth.go index f6b96667..4e70fadd 100644 --- a/common/crypto/auth.go +++ b/common/crypto/auth.go @@ -29,6 +29,26 @@ func (v StaticBytesGenerator) Next() []byte { return v.Content } +type IncreasingAEADNonceGenerator struct { + nonce []byte +} + +func NewIncreasingAEADNonceGenerator() *IncreasingAEADNonceGenerator { + return &IncreasingAEADNonceGenerator{ + nonce: []byte{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + } +} + +func (g *IncreasingAEADNonceGenerator) Next() []byte { + for i := range g.nonce { + g.nonce[i]++ + if g.nonce[i] != 0 { + break + } + } + return g.nonce +} + type Authenticator interface { NonceSize() int Overhead() int diff --git a/common/crypto/chunk.go b/common/crypto/chunk.go index c66a107b..84eb438c 100644 --- a/common/crypto/chunk.go +++ b/common/crypto/chunk.go @@ -34,6 +34,29 @@ func (PlainChunkSizeParser) Decode(b []byte) (uint16, error) { return serial.BytesToUint16(b), nil } +type AEADChunkSizeParser struct { + Auth *AEADAuthenticator +} + +func (p *AEADChunkSizeParser) SizeBytes() int { + return 2 + p.Auth.Overhead() +} + +func (p *AEADChunkSizeParser) Encode(size uint16, b []byte) []byte { + b = serial.Uint16ToBytes(size, b) + b, err := p.Auth.Seal(b[:0], b) + common.Must(err) + return b +} + +func (p *AEADChunkSizeParser) Decode(b []byte) (uint16, error) { + b, err := p.Auth.Open(b[:0], b) + if err != nil { + return 0, err + } + return serial.BytesToUint16(b), nil +} + type ChunkStreamReader struct { sizeDecoder ChunkSizeDecoder reader buf.Reader diff --git a/proxy/shadowsocks/client.go b/proxy/shadowsocks/client.go index a61b6afb..e93ee370 100644 --- a/proxy/shadowsocks/client.go +++ b/proxy/shadowsocks/client.go @@ -105,10 +105,7 @@ func (v *Client) Process(ctx context.Context, outboundRay ray.OutboundRay, diale } requestDone := signal.ExecuteAsync(func() error { - if err := buf.Copy(outboundRay.OutboundInput(), bodyWriter, buf.UpdateActivity(timer)); err != nil { - return err - } - return nil + return buf.Copy(outboundRay.OutboundInput(), bodyWriter, buf.UpdateActivity(timer)) }) responseDone := signal.ExecuteAsync(func() error { @@ -119,11 +116,7 @@ func (v *Client) Process(ctx context.Context, outboundRay ray.OutboundRay, diale return err } - if err := buf.Copy(responseReader, outboundRay.OutboundOutput(), buf.UpdateActivity(timer)); err != nil { - return err - } - - return nil + return buf.Copy(responseReader, outboundRay.OutboundOutput(), buf.UpdateActivity(timer)) }) if err := signal.ErrorOrFinish2(ctx, requestDone, responseDone); err != nil { diff --git a/proxy/shadowsocks/config.go b/proxy/shadowsocks/config.go index 15c35333..43e4b3c6 100644 --- a/proxy/shadowsocks/config.go +++ b/proxy/shadowsocks/config.go @@ -2,9 +2,17 @@ package shadowsocks import ( "bytes" + "crypto/aes" "crypto/cipher" "crypto/md5" + "crypto/sha1" + "io" + "golang.org/x/crypto/chacha20poly1305" + "golang.org/x/crypto/hkdf" + + "v2ray.com/core/common" + "v2ray.com/core/common/buf" "v2ray.com/core/common/crypto" "v2ray.com/core/common/protocol" ) @@ -22,6 +30,20 @@ func (v *ShadowsocksAccount) Equals(another protocol.Account) bool { return false } +func createAesGcm(key []byte) cipher.AEAD { + block, err := aes.NewCipher(key) + common.Must(err) + gcm, err := cipher.NewGCM(block) + common.Must(err) + return gcm +} + +func createChacha20Poly1305(key []byte) cipher.AEAD { + chacha20, err := chacha20poly1305.New(key) + common.Must(err) + return chacha20 +} + func (v *Account) GetCipher() (Cipher, error) { switch v.CipherType { case CipherType_AES_128_CFB: @@ -32,6 +54,24 @@ func (v *Account) GetCipher() (Cipher, error) { return &ChaCha20{IVBytes: 8}, nil case CipherType_CHACHA20_IETF: return &ChaCha20{IVBytes: 12}, nil + case CipherType_AES_128_GCM: + return &AEADCipher{ + KeyBytes: 16, + IVBytes: 16, + AEADAuthCreator: createAesGcm, + }, nil + case CipherType_AES_256_GCM: + return &AEADCipher{ + KeyBytes: 32, + IVBytes: 32, + AEADAuthCreator: createAesGcm, + }, nil + case CipherType_CHACHA20_POLY1305: + return &AEADCipher{ + KeyBytes: 32, + IVBytes: 32, + AEADAuthCreator: createChacha20Poly1305, + }, nil default: return nil, newError("Unsupported cipher.") } @@ -60,8 +100,8 @@ func (v *Account) GetCipherKey() []byte { type Cipher interface { KeySize() int IVSize() int - NewEncodingStream(key []byte, iv []byte) (cipher.Stream, error) - NewDecodingStream(key []byte, iv []byte) (cipher.Stream, error) + NewEncryptionWriter(key []byte, iv []byte, writer io.Writer) (buf.Writer, error) + NewDecryptionReader(key []byte, iv []byte, reader io.Reader) (buf.Reader, error) } type AesCfb struct { @@ -76,14 +116,54 @@ func (v *AesCfb) IVSize() int { return 16 } -func (v *AesCfb) NewEncodingStream(key []byte, iv []byte) (cipher.Stream, error) { +func (v *AesCfb) NewEncryptionWriter(key []byte, iv []byte, writer io.Writer) (buf.Writer, error) { stream := crypto.NewAesEncryptionStream(key, iv) - return stream, nil + return buf.NewWriter(crypto.NewCryptionWriter(stream, writer)), nil } -func (v *AesCfb) NewDecodingStream(key []byte, iv []byte) (cipher.Stream, error) { +func (v *AesCfb) NewDecryptionReader(key []byte, iv []byte, reader io.Reader) (buf.Reader, error) { stream := crypto.NewAesDecryptionStream(key, iv) - return stream, nil + return buf.NewReader(crypto.NewCryptionReader(stream, reader)), nil +} + +type AEADCipher struct { + KeyBytes int + IVBytes int + AEADAuthCreator func(key []byte) cipher.AEAD +} + +func (c *AEADCipher) KeySize() int { + return c.KeyBytes +} + +func (c *AEADCipher) IVSize() int { + return c.IVBytes +} + +func (c *AEADCipher) NewEncryptionWriter(key []byte, iv []byte, writer io.Writer) (buf.Writer, error) { + nonce := crypto.NewIncreasingAEADNonceGenerator() + subkey := make([]byte, c.KeyBytes) + hkdfSHA1(key, iv, subkey) + auth := &crypto.AEADAuthenticator{ + AEAD: c.AEADAuthCreator(subkey), + NonceGenerator: nonce, + } + return crypto.NewAuthenticationWriter(auth, &crypto.AEADChunkSizeParser{ + Auth: auth, + }, writer, protocol.TransferTypeStream), nil +} + +func (c *AEADCipher) NewDecryptionReader(key []byte, iv []byte, reader io.Reader) (buf.Reader, error) { + nonce := crypto.NewIncreasingAEADNonceGenerator() + subkey := make([]byte, c.KeyBytes) + hkdfSHA1(key, iv, subkey) + auth := &crypto.AEADAuthenticator{ + AEAD: c.AEADAuthCreator(subkey), + NonceGenerator: nonce, + } + return crypto.NewAuthenticationReader(auth, &crypto.AEADChunkSizeParser{ + Auth: auth, + }, reader, protocol.TransferTypeStream), nil } type ChaCha20 struct { @@ -98,12 +178,14 @@ func (v *ChaCha20) IVSize() int { return v.IVBytes } -func (v *ChaCha20) NewEncodingStream(key []byte, iv []byte) (cipher.Stream, error) { - return crypto.NewChaCha20Stream(key, iv), nil +func (v *ChaCha20) NewEncryptionWriter(key []byte, iv []byte, writer io.Writer) (buf.Writer, error) { + stream := crypto.NewChaCha20Stream(key, iv) + return buf.NewWriter(crypto.NewCryptionWriter(stream, writer)), nil } -func (v *ChaCha20) NewDecodingStream(key []byte, iv []byte) (cipher.Stream, error) { - return crypto.NewChaCha20Stream(key, iv), nil +func (v *ChaCha20) NewDecryptionReader(key []byte, iv []byte, reader io.Reader) (buf.Reader, error) { + stream := crypto.NewChaCha20Stream(key, iv) + return buf.NewReader(crypto.NewCryptionReader(stream, reader)), nil } func PasswordToCipherKey(password string, keySize int) []byte { @@ -123,3 +205,8 @@ func PasswordToCipherKey(password string, keySize int) []byte { } return key } + +func hkdfSHA1(secret, salt, outkey []byte) { + r := hkdf.New(sha1.New, secret, salt, []byte("ss-subkey")) + common.Must2(io.ReadFull(r, outkey)) +} diff --git a/proxy/shadowsocks/protocol.go b/proxy/shadowsocks/protocol.go index c4454895..5901d3d0 100644 --- a/proxy/shadowsocks/protocol.go +++ b/proxy/shadowsocks/protocol.go @@ -8,7 +8,6 @@ import ( "v2ray.com/core/common" "v2ray.com/core/common/bitmask" "v2ray.com/core/common/buf" - "v2ray.com/core/common/crypto" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/serial" @@ -40,11 +39,11 @@ func ReadTCPSession(user *protocol.User, reader io.Reader) (*protocol.RequestHea iv := append([]byte(nil), buffer.BytesTo(ivLen)...) - stream, err := account.Cipher.NewDecodingStream(account.Key, iv) + r, err := account.Cipher.NewDecryptionReader(account.Key, iv, reader) if err != nil { return nil, nil, newError("failed to initialize decoding stream").Base(err).AtError() } - reader = crypto.NewCryptionReader(stream, reader) + reader = r.(io.Reader) authenticator := NewAuthenticator(HeaderKeyGenerator(account.Key, iv)) request := &protocol.RequestHeader{ @@ -144,12 +143,12 @@ func WriteTCPRequest(request *protocol.RequestHeader, writer io.Writer) (buf.Wri return nil, newError("failed to write IV") } - stream, err := account.Cipher.NewEncodingStream(account.Key, iv) + w, err := account.Cipher.NewEncryptionWriter(account.Key, iv, writer) if err != nil { return nil, newError("failed to create encoding stream").Base(err).AtError() } - writer = crypto.NewCryptionWriter(stream, writer) + writer = w.(io.Writer) header := buf.NewLocal(512) @@ -208,11 +207,7 @@ func ReadTCPResponse(user *protocol.User, reader io.Reader) (buf.Reader, error) return nil, newError("failed to read IV").Base(err) } - stream, err := account.Cipher.NewDecodingStream(account.Key, iv) - if err != nil { - return nil, newError("failed to initialize decoding stream").Base(err).AtError() - } - return buf.NewReader(crypto.NewCryptionReader(stream, reader)), nil + return account.Cipher.NewDecryptionReader(account.Key, iv, reader) } func WriteTCPResponse(request *protocol.RequestHeader, writer io.Writer) (buf.Writer, error) { @@ -230,12 +225,7 @@ func WriteTCPResponse(request *protocol.RequestHeader, writer io.Writer) (buf.Wr return nil, newError("failed to write IV.").Base(err) } - stream, err := account.Cipher.NewEncodingStream(account.Key, iv) - if err != nil { - return nil, newError("failed to create encoding stream.").Base(err).AtError() - } - - return buf.NewWriter(crypto.NewCryptionWriter(stream, writer)), nil + return account.Cipher.NewEncryptionWriter(account.Key, iv, writer) } func EncodeUDPPacket(request *protocol.RequestHeader, payload []byte) (*buf.Buffer, error) { @@ -251,36 +241,41 @@ func EncodeUDPPacket(request *protocol.RequestHeader, payload []byte) (*buf.Buff buffer.AppendSupplier(buf.ReadFullFrom(rand.Reader, ivLen)) iv := buffer.Bytes() + payloadBuffer := buf.NewLocal(512) + defer payloadBuffer.Release() + switch request.Address.Family() { case net.AddressFamilyIPv4: - buffer.AppendBytes(AddrTypeIPv4) - buffer.Append([]byte(request.Address.IP())) + payloadBuffer.AppendBytes(AddrTypeIPv4) + payloadBuffer.Append([]byte(request.Address.IP())) case net.AddressFamilyIPv6: - buffer.AppendBytes(AddrTypeIPv6) - buffer.Append([]byte(request.Address.IP())) + payloadBuffer.AppendBytes(AddrTypeIPv6) + payloadBuffer.Append([]byte(request.Address.IP())) case net.AddressFamilyDomain: - buffer.AppendBytes(AddrTypeDomain, byte(len(request.Address.Domain()))) - buffer.Append([]byte(request.Address.Domain())) + payloadBuffer.AppendBytes(AddrTypeDomain, byte(len(request.Address.Domain()))) + payloadBuffer.Append([]byte(request.Address.Domain())) default: return nil, newError("unsupported address type: ", request.Address.Family()).AtError() } - buffer.AppendSupplier(serial.WriteUint16(uint16(request.Port))) - buffer.Append(payload) + payloadBuffer.AppendSupplier(serial.WriteUint16(uint16(request.Port))) + payloadBuffer.Append(payload) if request.Option.Has(RequestOptionOneTimeAuth) { authenticator := NewAuthenticator(HeaderKeyGenerator(account.Key, iv)) - buffer.SetByte(ivLen, buffer.Byte(ivLen)|0x10) + payloadBuffer.SetByte(0, payloadBuffer.Byte(0)|0x10) - buffer.AppendSupplier(authenticator.Authenticate(buffer.BytesFrom(ivLen))) + payloadBuffer.AppendSupplier(authenticator.Authenticate(payloadBuffer.Bytes())) } - stream, err := account.Cipher.NewEncodingStream(account.Key, iv) + w, err := account.Cipher.NewEncryptionWriter(account.Key, iv, buffer) if err != nil { return nil, newError("failed to create encoding stream").Base(err).AtError() } + if err := w.WriteMultiBuffer(buf.NewMultiBufferValue(payloadBuffer)); err != nil { + return nil, newError("failed to encrypt UDP payload").Base(err).AtWarning() + } - stream.XORKeyStream(buffer.BytesFrom(ivLen), buffer.BytesFrom(ivLen)) return buffer, nil } @@ -295,11 +290,17 @@ func DecodeUDPPacket(user *protocol.User, payload *buf.Buffer) (*protocol.Reques iv := payload.BytesTo(ivLen) payload.SliceFrom(ivLen) - stream, err := account.Cipher.NewDecodingStream(account.Key, iv) + r, err := account.Cipher.NewDecryptionReader(account.Key, iv, payload) if err != nil { return nil, nil, newError("failed to initialize decoding stream").Base(err).AtError() } - stream.XORKeyStream(payload.Bytes(), payload.Bytes()) + mb, err := r.ReadMultiBuffer() + if err != nil { + return nil, nil, newError("failed to decrypt UDP payload").Base(err).AtWarning() + } + payload.Release() + payload = mb.SplitFirst() + mb.Release() authenticator := NewAuthenticator(HeaderKeyGenerator(account.Key, iv)) request := &protocol.RequestHeader{ From 80258c05424b8885e8fba406d50e505a2d896a49 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 26 Nov 2017 00:58:57 +0100 Subject: [PATCH 188/229] handle AEAD cipher --- proxy/shadowsocks/config.go | 13 +++++++++++++ proxy/shadowsocks/protocol.go | 8 ++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/proxy/shadowsocks/config.go b/proxy/shadowsocks/config.go index 43e4b3c6..1408407f 100644 --- a/proxy/shadowsocks/config.go +++ b/proxy/shadowsocks/config.go @@ -102,12 +102,17 @@ type Cipher interface { IVSize() int NewEncryptionWriter(key []byte, iv []byte, writer io.Writer) (buf.Writer, error) NewDecryptionReader(key []byte, iv []byte, reader io.Reader) (buf.Reader, error) + IsAEAD() bool } type AesCfb struct { KeyBytes int } +func (*AesCfb) IsAEAD() bool { + return false +} + func (v *AesCfb) KeySize() int { return v.KeyBytes } @@ -132,6 +137,10 @@ type AEADCipher struct { AEADAuthCreator func(key []byte) cipher.AEAD } +func (*AEADCipher) IsAEAD() bool { + return true +} + func (c *AEADCipher) KeySize() int { return c.KeyBytes } @@ -170,6 +179,10 @@ type ChaCha20 struct { IVBytes int } +func (*ChaCha20) IsAEAD() bool { + return false +} + func (v *ChaCha20) KeySize() int { return 32 } diff --git a/proxy/shadowsocks/protocol.go b/proxy/shadowsocks/protocol.go index 5901d3d0..c58ecbcc 100644 --- a/proxy/shadowsocks/protocol.go +++ b/proxy/shadowsocks/protocol.go @@ -61,7 +61,7 @@ func ReadTCPSession(user *protocol.User, reader io.Reader) (*protocol.RequestHea request.Option.Set(RequestOptionOneTimeAuth) } - if request.Option.Has(RequestOptionOneTimeAuth) && account.OneTimeAuth == Account_Disabled { + if request.Option.Has(RequestOptionOneTimeAuth) && (account.OneTimeAuth == Account_Disabled || account.Cipher.IsAEAD()) { return nil, nil, newError("rejecting connection with OTA enabled, while server disables OTA") } @@ -136,8 +136,12 @@ func WriteTCPRequest(request *protocol.RequestHeader, writer io.Writer) (buf.Wri } account := rawAccount.(*ShadowsocksAccount) + if account.Cipher.IsAEAD() { + request.Option.Clear(RequestOptionOneTimeAuth) + } + iv := make([]byte, account.Cipher.IVSize()) - rand.Read(iv) + common.Must2(rand.Read(iv)) _, err = writer.Write(iv) if err != nil { return nil, newError("failed to write IV") From 9dbdcb3a39d0ab4a49047e655dc24ba8a6fc0b4a Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 26 Nov 2017 00:59:56 +0100 Subject: [PATCH 189/229] fix check of AEAD cipher --- proxy/shadowsocks/protocol.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proxy/shadowsocks/protocol.go b/proxy/shadowsocks/protocol.go index c58ecbcc..b4edcf14 100644 --- a/proxy/shadowsocks/protocol.go +++ b/proxy/shadowsocks/protocol.go @@ -65,7 +65,7 @@ func ReadTCPSession(user *protocol.User, reader io.Reader) (*protocol.RequestHea return nil, nil, newError("rejecting connection with OTA enabled, while server disables OTA") } - if !request.Option.Has(RequestOptionOneTimeAuth) && account.OneTimeAuth == Account_Enabled { + if !account.Cipher.IsAEAD() && !request.Option.Has(RequestOptionOneTimeAuth) && account.OneTimeAuth == Account_Enabled { return nil, nil, newError("rejecting connection with OTA disabled, while server enables OTA") } From 02ab3f3494952afdff296932645ed0983b386e6c Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 26 Nov 2017 01:02:10 +0100 Subject: [PATCH 190/229] refine aead check on server --- proxy/shadowsocks/protocol.go | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/proxy/shadowsocks/protocol.go b/proxy/shadowsocks/protocol.go index b4edcf14..46cd512c 100644 --- a/proxy/shadowsocks/protocol.go +++ b/proxy/shadowsocks/protocol.go @@ -56,19 +56,21 @@ func ReadTCPSession(user *protocol.User, reader io.Reader) (*protocol.RequestHea return nil, nil, newError("failed to read address type").Base(err) } + if !account.Cipher.IsAEAD() { + if (buffer.Byte(0) & 0x10) == 0x10 { + request.Option.Set(RequestOptionOneTimeAuth) + } + + if request.Option.Has(RequestOptionOneTimeAuth) && account.OneTimeAuth == Account_Disabled { + return nil, nil, newError("rejecting connection with OTA enabled, while server disables OTA") + } + + if !request.Option.Has(RequestOptionOneTimeAuth) && account.OneTimeAuth == Account_Enabled { + return nil, nil, newError("rejecting connection with OTA disabled, while server enables OTA") + } + } + addrType := (buffer.Byte(0) & 0x0F) - if (buffer.Byte(0) & 0x10) == 0x10 { - request.Option.Set(RequestOptionOneTimeAuth) - } - - if request.Option.Has(RequestOptionOneTimeAuth) && (account.OneTimeAuth == Account_Disabled || account.Cipher.IsAEAD()) { - return nil, nil, newError("rejecting connection with OTA enabled, while server disables OTA") - } - - if !account.Cipher.IsAEAD() && !request.Option.Has(RequestOptionOneTimeAuth) && account.OneTimeAuth == Account_Enabled { - return nil, nil, newError("rejecting connection with OTA disabled, while server enables OTA") - } - switch addrType { case AddrTypeIPv4: if err := buffer.AppendSupplier(buf.ReadFullFrom(reader, 4)); err != nil { From 6c0a1439c443e9a3c013e8c390225a6b4acae824 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 26 Nov 2017 14:18:23 +0100 Subject: [PATCH 191/229] fix #739 --- proxy/shadowsocks/protocol.go | 60 ++++++++++++++++++----------------- 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/proxy/shadowsocks/protocol.go b/proxy/shadowsocks/protocol.go index 46cd512c..fc395ed7 100644 --- a/proxy/shadowsocks/protocol.go +++ b/proxy/shadowsocks/protocol.go @@ -244,10 +244,10 @@ func EncodeUDPPacket(request *protocol.RequestHeader, payload []byte) (*buf.Buff buffer := buf.New() ivLen := account.Cipher.IVSize() - buffer.AppendSupplier(buf.ReadFullFrom(rand.Reader, ivLen)) + common.Must(buffer.Reset(buf.ReadFullFrom(rand.Reader, ivLen))) iv := buffer.Bytes() - payloadBuffer := buf.NewLocal(512) + payloadBuffer := buf.New() defer payloadBuffer.Release() switch request.Address.Family() { @@ -264,14 +264,14 @@ func EncodeUDPPacket(request *protocol.RequestHeader, payload []byte) (*buf.Buff return nil, newError("unsupported address type: ", request.Address.Family()).AtError() } - payloadBuffer.AppendSupplier(serial.WriteUint16(uint16(request.Port))) + common.Must(payloadBuffer.AppendSupplier(serial.WriteUint16(uint16(request.Port)))) payloadBuffer.Append(payload) - if request.Option.Has(RequestOptionOneTimeAuth) { + if !account.Cipher.IsAEAD() && request.Option.Has(RequestOptionOneTimeAuth) { authenticator := NewAuthenticator(HeaderKeyGenerator(account.Key, iv)) payloadBuffer.SetByte(0, payloadBuffer.Byte(0)|0x10) - payloadBuffer.AppendSupplier(authenticator.Authenticate(payloadBuffer.Bytes())) + common.Must(payloadBuffer.AppendSupplier(authenticator.Authenticate(payloadBuffer.Bytes()))) } w, err := account.Cipher.NewEncryptionWriter(account.Key, iv, buffer) @@ -293,7 +293,8 @@ func DecodeUDPPacket(user *protocol.User, payload *buf.Buffer) (*protocol.Reques account := rawAccount.(*ShadowsocksAccount) ivLen := account.Cipher.IVSize() - iv := payload.BytesTo(ivLen) + iv := make([]byte, ivLen) + copy(iv, payload.BytesTo(ivLen)) payload.SliceFrom(ivLen) r, err := account.Cipher.NewDecryptionReader(account.Key, iv, payload) @@ -315,34 +316,35 @@ func DecodeUDPPacket(user *protocol.User, payload *buf.Buffer) (*protocol.Reques Command: protocol.RequestCommandUDP, } - addrType := (payload.Byte(0) & 0x0F) - if (payload.Byte(0) & 0x10) == 0x10 { - request.Option |= RequestOptionOneTimeAuth - } - - if request.Option.Has(RequestOptionOneTimeAuth) && account.OneTimeAuth == Account_Disabled { - return nil, nil, newError("rejecting packet with OTA enabled, while server disables OTA").AtWarning() - } - - if !request.Option.Has(RequestOptionOneTimeAuth) && account.OneTimeAuth == Account_Enabled { - return nil, nil, newError("rejecting packet with OTA disabled, while server enables OTA").AtWarning() - } - - if request.Option.Has(RequestOptionOneTimeAuth) { - payloadLen := payload.Len() - AuthSize - authBytes := payload.BytesFrom(payloadLen) - - actualAuth := make([]byte, AuthSize) - authenticator.Authenticate(payload.BytesTo(payloadLen))(actualAuth) - if !bytes.Equal(actualAuth, authBytes) { - return nil, nil, newError("invalid OTA") + if !account.Cipher.IsAEAD() { + if (payload.Byte(0) & 0x10) == 0x10 { + request.Option |= RequestOptionOneTimeAuth } - payload.Slice(0, payloadLen) + if request.Option.Has(RequestOptionOneTimeAuth) && account.OneTimeAuth == Account_Disabled { + return nil, nil, newError("rejecting packet with OTA enabled, while server disables OTA").AtWarning() + } + + if !request.Option.Has(RequestOptionOneTimeAuth) && account.OneTimeAuth == Account_Enabled { + return nil, nil, newError("rejecting packet with OTA disabled, while server enables OTA").AtWarning() + } + + if request.Option.Has(RequestOptionOneTimeAuth) { + payloadLen := payload.Len() - AuthSize + authBytes := payload.BytesFrom(payloadLen) + + actualAuth := make([]byte, AuthSize) + authenticator.Authenticate(payload.BytesTo(payloadLen))(actualAuth) + if !bytes.Equal(actualAuth, authBytes) { + return nil, nil, newError("invalid OTA") + } + + payload.Slice(0, payloadLen) + } } + addrType := (payload.Byte(0) & 0x0F) payload.SliceFrom(1) - switch addrType { case AddrTypeIPv4: request.Address = net.IPAddress(payload.BytesTo(4)) From 9a2a19509cc8e2a5b9d612a7a84cc0a6e59f01b9 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 26 Nov 2017 14:18:48 +0100 Subject: [PATCH 192/229] more time for vmess none --- testing/scenarios/vmess_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing/scenarios/vmess_test.go b/testing/scenarios/vmess_test.go index 067d14d5..4d6984e6 100644 --- a/testing/scenarios/vmess_test.go +++ b/testing/scenarios/vmess_test.go @@ -652,7 +652,7 @@ func TestVMessNone(t *testing.T) { assert(err, IsNil) assert(nBytes, Equals, len(payload)) - response := readFrom(conn, time.Second*20, 1024*1024) + response := readFrom(conn, time.Second*30, 1024*1024) assert(response, Equals, xor(payload)) assert(conn.Close(), IsNil) From 519eb344db8a6087e4709bea948b45ba6d8c7f9d Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 26 Nov 2017 15:08:37 +0100 Subject: [PATCH 193/229] handle data first and then error --- common/buf/copy.go | 3 +-- common/buf/reader.go | 32 ++++++++++++++++++-------------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/common/buf/copy.go b/common/buf/copy.go index 75e6408b..d4f65235 100644 --- a/common/buf/copy.go +++ b/common/buf/copy.go @@ -91,8 +91,7 @@ func copyInternal(reader Reader, writer Writer, handler *copyHandler) error { buffer.Release() return werr } - } - if err != nil { + } else if err != nil { return err } } diff --git a/common/buf/reader.go b/common/buf/reader.go index 632a0039..f7b425e8 100644 --- a/common/buf/reader.go +++ b/common/buf/reader.go @@ -25,14 +25,15 @@ func NewBytesToBufferReader(reader io.Reader) Reader { func (r *BytesToBufferReader) readSmall() (MultiBuffer, error) { b := New() - if err := b.Reset(ReadFrom(r.Reader)); err != nil { - b.Release() - return nil, err - } + err := b.Reset(ReadFrom(r.Reader)) if b.IsFull() { r.buffer = make([]byte, 32*1024) } - return NewMultiBufferValue(b), nil + if !b.IsEmpty() { + return NewMultiBufferValue(b), nil + } + b.Release() + return nil, err } // ReadMultiBuffer implements Reader. @@ -45,7 +46,7 @@ func (r *BytesToBufferReader) ReadMultiBuffer() (MultiBuffer, error) { if nBytes > 0 { mb := NewMultiBufferCap(nBytes/Size + 1) mb.Write(r.buffer[:nBytes]) - return mb, err + return mb, nil } return nil, err } @@ -122,17 +123,20 @@ func (r *BufferedReader) ReadMultiBuffer() (MultiBuffer, error) { } // ReadAtMost returns a MultiBuffer with at most size. -func (r *BufferedReader) ReadAtMost(size int) (mb MultiBuffer, err error) { +func (r *BufferedReader) ReadAtMost(size int) (MultiBuffer, error) { if r.leftOver == nil { - r.leftOver, err = r.stream.ReadMultiBuffer() - } - if r.leftOver != nil { - mb = r.leftOver.SliceBySize(size) - if r.leftOver.IsEmpty() { - r.leftOver = nil + mb, err := r.stream.ReadMultiBuffer() + if mb.IsEmpty() && err != nil { + return nil, err } + r.leftOver = mb } - return + + mb := r.leftOver.SliceBySize(size) + if r.leftOver.IsEmpty() { + r.leftOver = nil + } + return mb, nil } func (r *BufferedReader) writeToInternal(writer io.Writer) (int64, error) { From 721bea5d54d30967e7df137eddebb39ac19e7216 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 26 Nov 2017 15:13:33 +0100 Subject: [PATCH 194/229] fix lint warnings --- proxy/http/server.go | 2 +- proxy/shadowsocks/protocol.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/proxy/http/server.go b/proxy/http/server.go index 5d472d66..520a3a78 100644 --- a/proxy/http/server.go +++ b/proxy/http/server.go @@ -171,7 +171,7 @@ func (s *Server) handleConnect(ctx context.Context, request *http.Request, reade if reader.Buffered() > 0 { payload := buf.New() common.Must(payload.Reset(func(b []byte) (int, error) { - return reader.Read(b) + return reader.Read(b[:reader.Buffered()]) })) if err := ray.InboundInput().WriteMultiBuffer(buf.NewMultiBufferValue(payload)); err != nil { return err diff --git a/proxy/shadowsocks/protocol.go b/proxy/shadowsocks/protocol.go index fc395ed7..703c33c4 100644 --- a/proxy/shadowsocks/protocol.go +++ b/proxy/shadowsocks/protocol.go @@ -225,7 +225,7 @@ func WriteTCPResponse(request *protocol.RequestHeader, writer io.Writer) (buf.Wr account := rawAccount.(*ShadowsocksAccount) iv := make([]byte, account.Cipher.IVSize()) - rand.Read(iv) + common.Must2(rand.Read(iv)) _, err = writer.Write(iv) if err != nil { return nil, newError("failed to write IV.").Base(err) From e8901368d72f4b196842d62652814dc23b9014e8 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 26 Nov 2017 15:15:03 +0100 Subject: [PATCH 195/229] update http connect test --- testing/scenarios/http_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/testing/scenarios/http_test.go b/testing/scenarios/http_test.go index 64675143..d0033def 100644 --- a/testing/scenarios/http_test.go +++ b/testing/scenarios/http_test.go @@ -125,6 +125,8 @@ func TestHttpConnectMethod(t *testing.T) { payload := make([]byte, 1024*64) common.Must2(rand.Read(payload)) req, err := http.NewRequest("Connect", "http://"+dest.NetAddr()+"/", bytes.NewReader(payload)) + req.Header.Set("X-a", "b") + req.Header.Set("X-b", "d") common.Must(err) resp, err := client.Do(req) From b7d022702ec0a3cff99768f07df000e0190b237d Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 26 Nov 2017 15:36:05 +0100 Subject: [PATCH 196/229] warn user when http proxy is not finished properly --- proxy/http/server.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/proxy/http/server.go b/proxy/http/server.go index 520a3a78..9e674950 100644 --- a/proxy/http/server.go +++ b/proxy/http/server.go @@ -274,7 +274,10 @@ func (s *Server) handlePlainHTTP(ctx context.Context, request *http.Request, wri requestWriter := buf.NewBufferedWriter(ray.InboundInput()) common.Must(requestWriter.SetBuffered(false)) - return request.Write(requestWriter) + if err := request.Write(requestWriter); err != nil { + return newError("failed to write whole request").Base(err).AtWarning() + } + return nil }) responseDone := signal.ExecuteAsync(func() error { @@ -308,7 +311,7 @@ func (s *Server) handlePlainHTTP(ctx context.Context, request *http.Request, wri response.Header.Set("Proxy-Connection", "close") } if err := response.Write(writer); err != nil { - return newError("failed to write response").Base(err) + return newError("failed to write response").Base(err).AtWarning() } return nil }) From 4b990c49bc376cf0573c0806c115049cc715396f Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 26 Nov 2017 16:43:13 +0100 Subject: [PATCH 197/229] add ss submodules for testing --- .gitmodules | 6 ++++++ vendor/github.com/Yawning/chacha20 | 1 + vendor/github.com/shadowsocks/go-shadowsocks2 | 1 + 3 files changed, 8 insertions(+) create mode 160000 vendor/github.com/Yawning/chacha20 create mode 160000 vendor/github.com/shadowsocks/go-shadowsocks2 diff --git a/.gitmodules b/.gitmodules index 803988f5..02e8083b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,9 @@ [submodule "vendor/h12.me/socks"] path = vendor/h12.me/socks url = https://github.com/h12w/socks +[submodule "vendor/github.com/shadowsocks/go-shadowsocks2"] + path = vendor/github.com/shadowsocks/go-shadowsocks2 + url = https://github.com/shadowsocks/go-shadowsocks2 +[submodule "vendor/github.com/Yawning/chacha20"] + path = vendor/github.com/Yawning/chacha20 + url = https://github.com/Yawning/chacha20 diff --git a/vendor/github.com/Yawning/chacha20 b/vendor/github.com/Yawning/chacha20 new file mode 160000 index 00000000..e3b1f968 --- /dev/null +++ b/vendor/github.com/Yawning/chacha20 @@ -0,0 +1 @@ +Subproject commit e3b1f968fc6397b51d963fee8ec8711a47bc0ce8 diff --git a/vendor/github.com/shadowsocks/go-shadowsocks2 b/vendor/github.com/shadowsocks/go-shadowsocks2 new file mode 160000 index 00000000..87b55c90 --- /dev/null +++ b/vendor/github.com/shadowsocks/go-shadowsocks2 @@ -0,0 +1 @@ +Subproject commit 87b55c90ac57968b4979adaef9a51c98582f76a9 From 981c43afc2bcfab7fbbf1455fee05b745d0e6262 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 26 Nov 2017 16:55:35 +0100 Subject: [PATCH 198/229] allow nil additional data generator --- common/crypto/auth.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/common/crypto/auth.go b/common/crypto/auth.go index 4e70fadd..192396b7 100644 --- a/common/crypto/auth.go +++ b/common/crypto/auth.go @@ -68,7 +68,10 @@ func (v *AEADAuthenticator) Open(dst, cipherText []byte) ([]byte, error) { return nil, newError("invalid AEAD nonce size: ", len(iv)) } - additionalData := v.AdditionalDataGenerator.Next() + var additionalData []byte + if v.AdditionalDataGenerator != nil { + additionalData = v.AdditionalDataGenerator.Next() + } return v.AEAD.Open(dst, iv, cipherText, additionalData) } @@ -78,7 +81,10 @@ func (v *AEADAuthenticator) Seal(dst, plainText []byte) ([]byte, error) { return nil, newError("invalid AEAD nonce size: ", len(iv)) } - additionalData := v.AdditionalDataGenerator.Next() + var additionalData []byte + if v.AdditionalDataGenerator != nil { + additionalData = v.AdditionalDataGenerator.Next() + } return v.AEAD.Seal(dst, iv, plainText, additionalData), nil } From 40222de0f7bd5e556d0a0c18229231e24101f178 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 26 Nov 2017 16:55:46 +0100 Subject: [PATCH 199/229] fix chunk parser for ss aead --- common/crypto/chunk.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/crypto/chunk.go b/common/crypto/chunk.go index 84eb438c..5b622df6 100644 --- a/common/crypto/chunk.go +++ b/common/crypto/chunk.go @@ -43,7 +43,7 @@ func (p *AEADChunkSizeParser) SizeBytes() int { } func (p *AEADChunkSizeParser) Encode(size uint16, b []byte) []byte { - b = serial.Uint16ToBytes(size, b) + b = serial.Uint16ToBytes(size-uint16(p.Auth.Overhead()), b) b, err := p.Auth.Seal(b[:0], b) common.Must(err) return b @@ -54,7 +54,7 @@ func (p *AEADChunkSizeParser) Decode(b []byte) (uint16, error) { if err != nil { return 0, err } - return serial.BytesToUint16(b), nil + return serial.BytesToUint16(b) + uint16(p.Auth.Overhead()), nil } type ChunkStreamReader struct { From b64aceabcf6207643e812efe0d43b7dec5b7a44e Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 26 Nov 2017 16:56:01 +0100 Subject: [PATCH 200/229] fix aead reader and writer --- proxy/shadowsocks/protocol.go | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/proxy/shadowsocks/protocol.go b/proxy/shadowsocks/protocol.go index 703c33c4..e61cb7c8 100644 --- a/proxy/shadowsocks/protocol.go +++ b/proxy/shadowsocks/protocol.go @@ -43,7 +43,8 @@ func ReadTCPSession(user *protocol.User, reader io.Reader) (*protocol.RequestHea if err != nil { return nil, nil, newError("failed to initialize decoding stream").Base(err).AtError() } - reader = r.(io.Reader) + br := buf.NewBufferedReader(r) + reader = nil authenticator := NewAuthenticator(HeaderKeyGenerator(account.Key, iv)) request := &protocol.RequestHeader{ @@ -52,7 +53,7 @@ func ReadTCPSession(user *protocol.User, reader io.Reader) (*protocol.RequestHea Command: protocol.RequestCommandTCP, } - if err := buffer.Reset(buf.ReadFullFrom(reader, 1)); err != nil { + if err := buffer.Reset(buf.ReadFullFrom(br, 1)); err != nil { return nil, nil, newError("failed to read address type").Base(err) } @@ -73,21 +74,21 @@ func ReadTCPSession(user *protocol.User, reader io.Reader) (*protocol.RequestHea addrType := (buffer.Byte(0) & 0x0F) switch addrType { case AddrTypeIPv4: - if err := buffer.AppendSupplier(buf.ReadFullFrom(reader, 4)); err != nil { + if err := buffer.AppendSupplier(buf.ReadFullFrom(br, 4)); err != nil { return nil, nil, newError("failed to read IPv4 address").Base(err) } request.Address = net.IPAddress(buffer.BytesFrom(-4)) case AddrTypeIPv6: - if err := buffer.AppendSupplier(buf.ReadFullFrom(reader, 16)); err != nil { + if err := buffer.AppendSupplier(buf.ReadFullFrom(br, 16)); err != nil { return nil, nil, newError("failed to read IPv6 address").Base(err) } request.Address = net.IPAddress(buffer.BytesFrom(-16)) case AddrTypeDomain: - if err := buffer.AppendSupplier(buf.ReadFullFrom(reader, 1)); err != nil { + if err := buffer.AppendSupplier(buf.ReadFullFrom(br, 1)); err != nil { return nil, nil, newError("failed to read domain lenth.").Base(err) } domainLength := int(buffer.BytesFrom(-1)[0]) - err = buffer.AppendSupplier(buf.ReadFullFrom(reader, domainLength)) + err = buffer.AppendSupplier(buf.ReadFullFrom(br, domainLength)) if err != nil { return nil, nil, newError("failed to read domain").Base(err) } @@ -96,7 +97,7 @@ func ReadTCPSession(user *protocol.User, reader io.Reader) (*protocol.RequestHea // Check address validity after OTA verification. } - err = buffer.AppendSupplier(buf.ReadFullFrom(reader, 2)) + err = buffer.AppendSupplier(buf.ReadFullFrom(br, 2)) if err != nil { return nil, nil, newError("failed to read port").Base(err) } @@ -106,7 +107,7 @@ func ReadTCPSession(user *protocol.User, reader io.Reader) (*protocol.RequestHea actualAuth := make([]byte, AuthSize) authenticator.Authenticate(buffer.Bytes())(actualAuth) - err := buffer.AppendSupplier(buf.ReadFullFrom(reader, AuthSize)) + err := buffer.AppendSupplier(buf.ReadFullFrom(br, AuthSize)) if err != nil { return nil, nil, newError("Failed to read OTA").Base(err) } @@ -120,11 +121,13 @@ func ReadTCPSession(user *protocol.User, reader io.Reader) (*protocol.RequestHea return nil, nil, newError("invalid remote address.") } + br.SetBuffered(false) + var chunkReader buf.Reader if request.Option.Has(RequestOptionOneTimeAuth) { - chunkReader = NewChunkReader(reader, NewAuthenticator(ChunkKeyGenerator(iv))) + chunkReader = NewChunkReader(br, NewAuthenticator(ChunkKeyGenerator(iv))) } else { - chunkReader = buf.NewReader(reader) + chunkReader = buf.NewReader(br) } return request, chunkReader, nil @@ -154,8 +157,6 @@ func WriteTCPRequest(request *protocol.RequestHeader, writer io.Writer) (buf.Wri return nil, newError("failed to create encoding stream").Base(err).AtError() } - writer = w.(io.Writer) - header := buf.NewLocal(512) switch request.Address.Family() { @@ -185,16 +186,15 @@ func WriteTCPRequest(request *protocol.RequestHeader, writer io.Writer) (buf.Wri common.Must(header.AppendSupplier(authenticator.Authenticate(header.Bytes()))) } - _, err = writer.Write(header.Bytes()) - if err != nil { + if err := w.WriteMultiBuffer(buf.NewMultiBufferValue(header)); err != nil { return nil, newError("failed to write header").Base(err) } var chunkWriter buf.Writer if request.Option.Has(RequestOptionOneTimeAuth) { - chunkWriter = NewChunkWriter(writer, NewAuthenticator(ChunkKeyGenerator(iv))) + chunkWriter = NewChunkWriter(w.(io.Writer), NewAuthenticator(ChunkKeyGenerator(iv))) } else { - chunkWriter = buf.NewWriter(writer) + chunkWriter = w } return chunkWriter, nil From 9ec3e40cee01cd2d4ba97d325b7745ca904d2966 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 26 Nov 2017 16:56:09 +0100 Subject: [PATCH 201/229] more aead test cases --- testing/scenarios/shadowsocks_test.go | 316 ++++++++++++++++++++++++++ 1 file changed, 316 insertions(+) diff --git a/testing/scenarios/shadowsocks_test.go b/testing/scenarios/shadowsocks_test.go index fb444c5c..7f53a6c1 100644 --- a/testing/scenarios/shadowsocks_test.go +++ b/testing/scenarios/shadowsocks_test.go @@ -2,6 +2,7 @@ package scenarios import ( "crypto/rand" + "fmt" "sync" "testing" "time" @@ -18,6 +19,8 @@ import ( "v2ray.com/core/testing/servers/tcp" "v2ray.com/core/testing/servers/udp" . "v2ray.com/ext/assert" + + ss "github.com/shadowsocks/go-shadowsocks2/core" ) func TestShadowsocksAES256TCP(t *testing.T) { @@ -374,3 +377,316 @@ func TestShadowsocksChacha20TCP(t *testing.T) { CloseAllServers(servers) } + +func TestShadowsocksAES256GCMTCP(t *testing.T) { + assert := With(t) + + tcpServer := tcp.Server{ + MsgProcessor: xor, + } + dest, err := tcpServer.Start() + assert(err, IsNil) + defer tcpServer.Close() + + account := serial.ToTypedMessage(&shadowsocks.Account{ + Password: "shadowsocks-password", + CipherType: shadowsocks.CipherType_AES_256_GCM, + }) + + serverPort := pickPort() + serverConfig := &core.Config{ + App: []*serial.TypedMessage{ + serial.ToTypedMessage(&log.Config{ + ErrorLogLevel: log.LogLevel_Debug, + ErrorLogType: log.LogType_Console, + }), + }, + Inbound: []*proxyman.InboundHandlerConfig{ + { + ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ + PortRange: net.SinglePortRange(serverPort), + Listen: net.NewIPOrDomain(net.LocalHostIP), + }), + ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{ + User: &protocol.User{ + Account: account, + Level: 1, + }, + }), + }, + }, + Outbound: []*proxyman.OutboundHandlerConfig{ + { + ProxySettings: serial.ToTypedMessage(&freedom.Config{}), + }, + }, + } + + clientPort := pickPort() + clientConfig := &core.Config{ + App: []*serial.TypedMessage{ + serial.ToTypedMessage(&log.Config{ + ErrorLogLevel: log.LogLevel_Debug, + ErrorLogType: log.LogType_Console, + }), + }, + Inbound: []*proxyman.InboundHandlerConfig{ + { + ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ + PortRange: net.SinglePortRange(clientPort), + Listen: net.NewIPOrDomain(net.LocalHostIP), + }), + ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ + Address: net.NewIPOrDomain(dest.Address), + Port: uint32(dest.Port), + NetworkList: &net.NetworkList{ + Network: []net.Network{net.Network_TCP}, + }, + }), + }, + }, + Outbound: []*proxyman.OutboundHandlerConfig{ + { + ProxySettings: serial.ToTypedMessage(&shadowsocks.ClientConfig{ + Server: []*protocol.ServerEndpoint{ + { + Address: net.NewIPOrDomain(net.LocalHostIP), + Port: uint32(serverPort), + User: []*protocol.User{ + { + Account: account, + }, + }, + }, + }, + }), + }, + }, + } + + servers, err := InitializeServerConfigs(serverConfig, clientConfig) + assert(err, IsNil) + + var wg sync.WaitGroup + wg.Add(10) + for i := 0; i < 10; i++ { + go func() { + conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{ + IP: []byte{127, 0, 0, 1}, + Port: int(clientPort), + }) + assert(err, IsNil) + + payload := make([]byte, 10240*1024) + rand.Read(payload) + + nBytes, err := conn.Write([]byte(payload)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload)) + + response := readFrom(conn, time.Second*20, 10240*1024) + assert(response, Equals, xor([]byte(payload))) + assert(conn.Close(), IsNil) + wg.Done() + }() + } + wg.Wait() + + CloseAllServers(servers) +} + +func TestShadowsocksAES128GCMUDP(t *testing.T) { + assert := With(t) + + udpServer := udp.Server{ + MsgProcessor: xor, + } + dest, err := udpServer.Start() + assert(err, IsNil) + defer udpServer.Close() + + account := serial.ToTypedMessage(&shadowsocks.Account{ + Password: "shadowsocks-password", + CipherType: shadowsocks.CipherType_AES_128_GCM, + }) + + serverPort := pickPort() + serverConfig := &core.Config{ + App: []*serial.TypedMessage{ + serial.ToTypedMessage(&log.Config{ + ErrorLogLevel: log.LogLevel_Debug, + ErrorLogType: log.LogType_Console, + }), + }, + Inbound: []*proxyman.InboundHandlerConfig{ + { + ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ + PortRange: net.SinglePortRange(serverPort), + Listen: net.NewIPOrDomain(net.LocalHostIP), + }), + ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{ + UdpEnabled: true, + User: &protocol.User{ + Account: account, + Level: 1, + }, + }), + }, + }, + Outbound: []*proxyman.OutboundHandlerConfig{ + { + ProxySettings: serial.ToTypedMessage(&freedom.Config{}), + }, + }, + } + + clientPort := pickPort() + clientConfig := &core.Config{ + App: []*serial.TypedMessage{ + serial.ToTypedMessage(&log.Config{ + ErrorLogLevel: log.LogLevel_Debug, + ErrorLogType: log.LogType_Console, + }), + }, + Inbound: []*proxyman.InboundHandlerConfig{ + { + ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ + PortRange: net.SinglePortRange(clientPort), + Listen: net.NewIPOrDomain(net.LocalHostIP), + }), + ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ + Address: net.NewIPOrDomain(dest.Address), + Port: uint32(dest.Port), + NetworkList: &net.NetworkList{ + Network: []net.Network{net.Network_UDP}, + }, + }), + }, + }, + Outbound: []*proxyman.OutboundHandlerConfig{ + { + ProxySettings: serial.ToTypedMessage(&shadowsocks.ClientConfig{ + Server: []*protocol.ServerEndpoint{ + { + Address: net.NewIPOrDomain(net.LocalHostIP), + Port: uint32(serverPort), + User: []*protocol.User{ + { + Account: account, + }, + }, + }, + }, + }), + }, + }, + } + + servers, err := InitializeServerConfigs(serverConfig, clientConfig) + assert(err, IsNil) + + var wg sync.WaitGroup + wg.Add(10) + for i := 0; i < 10; i++ { + go func() { + conn, err := net.DialUDP("udp", nil, &net.UDPAddr{ + IP: []byte{127, 0, 0, 1}, + Port: int(clientPort), + }) + assert(err, IsNil) + + payload := make([]byte, 1024) + rand.Read(payload) + + nBytes, err := conn.Write([]byte(payload)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload)) + + response := readFrom(conn, time.Second*5, 1024) + assert(response, Equals, xor([]byte(payload))) + assert(conn.Close(), IsNil) + wg.Done() + }() + } + wg.Wait() + + CloseAllServers(servers) +} + +func TestShadowsocksAES256GCMConformance(t *testing.T) { + assert := With(t) + + tcpServer := tcp.Server{ + MsgProcessor: xor, + } + dest, err := tcpServer.Start() + assert(err, IsNil) + defer tcpServer.Close() + + account := serial.ToTypedMessage(&shadowsocks.Account{ + Password: "ss-password", + CipherType: shadowsocks.CipherType_AES_256_GCM, + }) + + serverPort := pickPort() + serverConfig := &core.Config{ + App: []*serial.TypedMessage{ + serial.ToTypedMessage(&log.Config{ + ErrorLogLevel: log.LogLevel_Debug, + ErrorLogType: log.LogType_Console, + }), + }, + Inbound: []*proxyman.InboundHandlerConfig{ + { + ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ + PortRange: net.SinglePortRange(serverPort), + Listen: net.NewIPOrDomain(net.LocalHostIP), + }), + ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{ + User: &protocol.User{ + Account: account, + Level: 1, + }, + }), + }, + }, + Outbound: []*proxyman.OutboundHandlerConfig{ + { + ProxySettings: serial.ToTypedMessage(&freedom.Config{}), + }, + }, + } + + servers, err := InitializeServerConfigs(serverConfig) + assert(err, IsNil) + + var wg sync.WaitGroup + wg.Add(10) + for i := 0; i < 10; i++ { + go func() { + cipher, err := ss.PickCipher("AES-256-GCM", nil, "ss-password") + assert(err, IsNil) + conn, err := ss.Dial("tcp", fmt.Sprintf(":%d", serverPort), cipher) + assert(err, IsNil) + _, err = conn.Write([]byte{1, 127, 0, 0, 1}) + assert(err, IsNil) + _, err = conn.Write(serial.Uint16ToBytes(dest.Port.Value(), nil)) + assert(err, IsNil) + + payload := make([]byte, 10240*1024) + rand.Read(payload) + + nBytes, err := conn.Write([]byte(payload)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload)) + + response := readFrom(conn, time.Second*30, 10240*1024) + assert(response, Equals, xor([]byte(payload))) + assert(conn.Close(), IsNil) + wg.Done() + }() + } + wg.Wait() + + CloseAllServers(servers) +} From fefb5c8e010d9b69fbb7453dc6d488e82655b6ab Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 26 Nov 2017 21:51:30 +0100 Subject: [PATCH 202/229] fix aead udp --- proxy/shadowsocks/config.go | 78 ++++++++++++++++++++++--- proxy/shadowsocks/protocol.go | 55 ++++++------------ testing/scenarios/shadowsocks_test.go | 83 +++++++++++++++++++++++++++ 3 files changed, 171 insertions(+), 45 deletions(-) diff --git a/proxy/shadowsocks/config.go b/proxy/shadowsocks/config.go index 1408407f..36d7307a 100644 --- a/proxy/shadowsocks/config.go +++ b/proxy/shadowsocks/config.go @@ -103,6 +103,8 @@ type Cipher interface { NewEncryptionWriter(key []byte, iv []byte, writer io.Writer) (buf.Writer, error) NewDecryptionReader(key []byte, iv []byte, reader io.Reader) (buf.Reader, error) IsAEAD() bool + EncodePacket(key []byte, b *buf.Buffer) error + DecodePacket(key []byte, b *buf.Buffer) error } type AesCfb struct { @@ -131,6 +133,21 @@ func (v *AesCfb) NewDecryptionReader(key []byte, iv []byte, reader io.Reader) (b return buf.NewReader(crypto.NewCryptionReader(stream, reader)), nil } +func (v *AesCfb) EncodePacket(key []byte, b *buf.Buffer) error { + iv := b.BytesTo(v.IVSize()) + stream := crypto.NewAesEncryptionStream(key, iv) + stream.XORKeyStream(b.BytesFrom(v.IVSize()), b.BytesFrom(v.IVSize())) + return nil +} + +func (v *AesCfb) DecodePacket(key []byte, b *buf.Buffer) error { + iv := b.BytesTo(v.IVSize()) + stream := crypto.NewAesEncryptionStream(key, iv) + stream.XORKeyStream(b.BytesFrom(v.IVSize()), b.BytesFrom(v.IVSize())) + b.SliceFrom(v.IVSize()) + return nil +} + type AEADCipher struct { KeyBytes int IVBytes int @@ -149,32 +166,60 @@ func (c *AEADCipher) IVSize() int { return c.IVBytes } -func (c *AEADCipher) NewEncryptionWriter(key []byte, iv []byte, writer io.Writer) (buf.Writer, error) { +func (c *AEADCipher) createAuthenticator(key []byte, iv []byte) *crypto.AEADAuthenticator { nonce := crypto.NewIncreasingAEADNonceGenerator() subkey := make([]byte, c.KeyBytes) hkdfSHA1(key, iv, subkey) - auth := &crypto.AEADAuthenticator{ + return &crypto.AEADAuthenticator{ AEAD: c.AEADAuthCreator(subkey), NonceGenerator: nonce, } +} + +func (c *AEADCipher) NewEncryptionWriter(key []byte, iv []byte, writer io.Writer) (buf.Writer, error) { + auth := c.createAuthenticator(key, iv) return crypto.NewAuthenticationWriter(auth, &crypto.AEADChunkSizeParser{ Auth: auth, }, writer, protocol.TransferTypeStream), nil } func (c *AEADCipher) NewDecryptionReader(key []byte, iv []byte, reader io.Reader) (buf.Reader, error) { - nonce := crypto.NewIncreasingAEADNonceGenerator() - subkey := make([]byte, c.KeyBytes) - hkdfSHA1(key, iv, subkey) - auth := &crypto.AEADAuthenticator{ - AEAD: c.AEADAuthCreator(subkey), - NonceGenerator: nonce, - } + auth := c.createAuthenticator(key, iv) return crypto.NewAuthenticationReader(auth, &crypto.AEADChunkSizeParser{ Auth: auth, }, reader, protocol.TransferTypeStream), nil } +func (c *AEADCipher) EncodePacket(key []byte, b *buf.Buffer) error { + ivLen := c.IVSize() + payloadLen := b.Len() + auth := c.createAuthenticator(key, b.BytesTo(ivLen)) + return b.Reset(func(bb []byte) (int, error) { + bbb, err := auth.Seal(bb[:ivLen], bb[ivLen:payloadLen]) + if err != nil { + return 0, err + } + return len(bbb), nil + }) +} + +func (c *AEADCipher) DecodePacket(key []byte, b *buf.Buffer) error { + ivLen := c.IVSize() + payloadLen := b.Len() + auth := c.createAuthenticator(key, b.BytesTo(ivLen)) + if err := b.Reset(func(bb []byte) (int, error) { + bbb, err := auth.Open(bb[:ivLen], bb[ivLen:payloadLen]) + if err != nil { + return 0, err + } + return len(bbb), nil + }); err != nil { + return err + } + b.SliceFrom(ivLen) + return nil +} + type ChaCha20 struct { IVBytes int } @@ -201,6 +246,21 @@ func (v *ChaCha20) NewDecryptionReader(key []byte, iv []byte, reader io.Reader) return buf.NewReader(crypto.NewCryptionReader(stream, reader)), nil } +func (v *ChaCha20) EncodePacket(key []byte, b *buf.Buffer) error { + iv := b.BytesTo(v.IVSize()) + stream := crypto.NewChaCha20Stream(key, iv) + stream.XORKeyStream(b.BytesFrom(v.IVSize()), b.BytesFrom(v.IVSize())) + return nil +} + +func (v *ChaCha20) DecodePacket(key []byte, b *buf.Buffer) error { + iv := b.BytesTo(v.IVSize()) + stream := crypto.NewChaCha20Stream(key, iv) + stream.XORKeyStream(b.BytesFrom(v.IVSize()), b.BytesFrom(v.IVSize())) + b.SliceFrom(v.IVSize()) + return nil +} + func PasswordToCipherKey(password string, keySize int) []byte { pwdBytes := []byte(password) key := make([]byte, 0, keySize) diff --git a/proxy/shadowsocks/protocol.go b/proxy/shadowsocks/protocol.go index e61cb7c8..e78ace71 100644 --- a/proxy/shadowsocks/protocol.go +++ b/proxy/shadowsocks/protocol.go @@ -247,39 +247,31 @@ func EncodeUDPPacket(request *protocol.RequestHeader, payload []byte) (*buf.Buff common.Must(buffer.Reset(buf.ReadFullFrom(rand.Reader, ivLen))) iv := buffer.Bytes() - payloadBuffer := buf.New() - defer payloadBuffer.Release() - switch request.Address.Family() { case net.AddressFamilyIPv4: - payloadBuffer.AppendBytes(AddrTypeIPv4) - payloadBuffer.Append([]byte(request.Address.IP())) + buffer.AppendBytes(AddrTypeIPv4) + buffer.Append([]byte(request.Address.IP())) case net.AddressFamilyIPv6: - payloadBuffer.AppendBytes(AddrTypeIPv6) - payloadBuffer.Append([]byte(request.Address.IP())) + buffer.AppendBytes(AddrTypeIPv6) + buffer.Append([]byte(request.Address.IP())) case net.AddressFamilyDomain: - payloadBuffer.AppendBytes(AddrTypeDomain, byte(len(request.Address.Domain()))) - payloadBuffer.Append([]byte(request.Address.Domain())) + buffer.AppendBytes(AddrTypeDomain, byte(len(request.Address.Domain()))) + buffer.Append([]byte(request.Address.Domain())) default: return nil, newError("unsupported address type: ", request.Address.Family()).AtError() } - common.Must(payloadBuffer.AppendSupplier(serial.WriteUint16(uint16(request.Port)))) - payloadBuffer.Append(payload) + common.Must(buffer.AppendSupplier(serial.WriteUint16(uint16(request.Port)))) + buffer.Append(payload) if !account.Cipher.IsAEAD() && request.Option.Has(RequestOptionOneTimeAuth) { authenticator := NewAuthenticator(HeaderKeyGenerator(account.Key, iv)) - payloadBuffer.SetByte(0, payloadBuffer.Byte(0)|0x10) + buffer.SetByte(ivLen, buffer.Byte(ivLen)|0x10) - common.Must(payloadBuffer.AppendSupplier(authenticator.Authenticate(payloadBuffer.Bytes()))) + common.Must(buffer.AppendSupplier(authenticator.Authenticate(buffer.BytesFrom(ivLen)))) } - - w, err := account.Cipher.NewEncryptionWriter(account.Key, iv, buffer) - if err != nil { - return nil, newError("failed to create encoding stream").Base(err).AtError() - } - if err := w.WriteMultiBuffer(buf.NewMultiBufferValue(payloadBuffer)); err != nil { - return nil, newError("failed to encrypt UDP payload").Base(err).AtWarning() + if err := account.Cipher.EncodePacket(account.Key, buffer); err != nil { + return nil, newError("failed to encrypt UDP payload").Base(err) } return buffer, nil @@ -292,24 +284,15 @@ func DecodeUDPPacket(user *protocol.User, payload *buf.Buffer) (*protocol.Reques } account := rawAccount.(*ShadowsocksAccount) - ivLen := account.Cipher.IVSize() - iv := make([]byte, ivLen) - copy(iv, payload.BytesTo(ivLen)) - payload.SliceFrom(ivLen) - - r, err := account.Cipher.NewDecryptionReader(account.Key, iv, payload) - if err != nil { - return nil, nil, newError("failed to initialize decoding stream").Base(err).AtError() + var authenticator *Authenticator + if !account.Cipher.IsAEAD() { + authenticator = NewAuthenticator(HeaderKeyGenerator(account.Key, payload.BytesTo(account.Cipher.IVSize()))) + } + + if err := account.Cipher.DecodePacket(account.Key, payload); err != nil { + return nil, nil, newError("failed to decrypt UDP payload").Base(err) } - mb, err := r.ReadMultiBuffer() - if err != nil { - return nil, nil, newError("failed to decrypt UDP payload").Base(err).AtWarning() - } - payload.Release() - payload = mb.SplitFirst() - mb.Release() - authenticator := NewAuthenticator(HeaderKeyGenerator(account.Key, iv)) request := &protocol.RequestHeader{ Version: Version, User: user, diff --git a/testing/scenarios/shadowsocks_test.go b/testing/scenarios/shadowsocks_test.go index 7f53a6c1..50235837 100644 --- a/testing/scenarios/shadowsocks_test.go +++ b/testing/scenarios/shadowsocks_test.go @@ -10,6 +10,7 @@ import ( "v2ray.com/core" "v2ray.com/core/app/log" "v2ray.com/core/app/proxyman" + "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/serial" @@ -690,3 +691,85 @@ func TestShadowsocksAES256GCMConformance(t *testing.T) { CloseAllServers(servers) } + +func TestShadowsocksChacha20Poly1305UDPConformance(t *testing.T) { + assert := With(t) + + udpServer := udp.Server{ + MsgProcessor: xor, + } + dest, err := udpServer.Start() + assert(err, IsNil) + defer udpServer.Close() + + account := serial.ToTypedMessage(&shadowsocks.Account{ + Password: "ss-password", + CipherType: shadowsocks.CipherType_CHACHA20_POLY1305, + }) + + serverPort := pickPort() + serverConfig := &core.Config{ + App: []*serial.TypedMessage{ + serial.ToTypedMessage(&log.Config{ + ErrorLogLevel: log.LogLevel_Debug, + ErrorLogType: log.LogType_Console, + }), + }, + Inbound: []*proxyman.InboundHandlerConfig{ + { + ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ + PortRange: net.SinglePortRange(serverPort), + Listen: net.NewIPOrDomain(net.LocalHostIP), + }), + ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{ + UdpEnabled: true, + User: &protocol.User{ + Account: account, + Level: 1, + }, + }), + }, + }, + Outbound: []*proxyman.OutboundHandlerConfig{ + { + ProxySettings: serial.ToTypedMessage(&freedom.Config{}), + }, + }, + } + + servers, err := InitializeServerConfigs(serverConfig) + assert(err, IsNil) + + cipher, err := ss.PickCipher("CHACHA20-IETF-POLY1305", nil, "ss-password") + assert(err, IsNil) + conn, err := ss.ListenPacket("udp", ":0", cipher) + assert(err, IsNil) + + for i := 0; i < 100; i++ { + + payload := buf.New() + payload.AppendBytes(1, 127, 0, 0, 1) + payload.AppendSupplier(serial.WriteUint16(dest.Port.Value())) + + payload.AppendSupplier(buf.ReadFullFrom(rand.Reader, 10)) + + nBytes, err := conn.WriteTo(payload.Bytes(), &net.UDPAddr{ + IP: []byte{127, 0, 0, 1}, + Port: int(serverPort), + }) + assert(err, IsNil) + assert(nBytes, Equals, payload.Len()) + + conn.SetReadDeadline(time.Now().Add(time.Second * 10)) + response := make([]byte, 10240) + nBytes, _, err = conn.ReadFrom(response) + assert(err, IsNil) + assert(response[:7], Equals, payload.BytesTo(7)) + assert(response[7:nBytes], Equals, xor(payload.BytesFrom(7))) + + } + + assert(conn.Close(), IsNil) + + CloseAllServers(servers) +} From eef2a72ac0188d1ab43f30da28c250cb2398d3a9 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Mon, 27 Nov 2017 10:42:34 +0100 Subject: [PATCH 203/229] fix aes cfb decode packet. fix #739 --- proxy/shadowsocks/config.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proxy/shadowsocks/config.go b/proxy/shadowsocks/config.go index 36d7307a..08dccf20 100644 --- a/proxy/shadowsocks/config.go +++ b/proxy/shadowsocks/config.go @@ -142,7 +142,7 @@ func (v *AesCfb) EncodePacket(key []byte, b *buf.Buffer) error { func (v *AesCfb) DecodePacket(key []byte, b *buf.Buffer) error { iv := b.BytesTo(v.IVSize()) - stream := crypto.NewAesEncryptionStream(key, iv) + stream := crypto.NewAesDecryptionStream(key, iv) stream.XORKeyStream(b.BytesFrom(v.IVSize()), b.BytesFrom(v.IVSize())) b.SliceFrom(v.IVSize()) return nil From 64e5430ed92046610d5707ae185eb4320019c3f2 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Mon, 27 Nov 2017 10:42:51 +0100 Subject: [PATCH 204/229] lazy init of authenticator --- proxy/shadowsocks/protocol.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/proxy/shadowsocks/protocol.go b/proxy/shadowsocks/protocol.go index e78ace71..819ed884 100644 --- a/proxy/shadowsocks/protocol.go +++ b/proxy/shadowsocks/protocol.go @@ -284,9 +284,12 @@ func DecodeUDPPacket(user *protocol.User, payload *buf.Buffer) (*protocol.Reques } account := rawAccount.(*ShadowsocksAccount) + var iv []byte var authenticator *Authenticator if !account.Cipher.IsAEAD() { - authenticator = NewAuthenticator(HeaderKeyGenerator(account.Key, payload.BytesTo(account.Cipher.IVSize()))) + // Keep track of IV as it gets removed from payload in DecodePacket. + iv = make([]byte, account.Cipher.IVSize()) + copy(iv, payload.BytesTo(account.Cipher.IVSize())) } if err := account.Cipher.DecodePacket(account.Key, payload); err != nil { @@ -316,6 +319,7 @@ func DecodeUDPPacket(user *protocol.User, payload *buf.Buffer) (*protocol.Reques payloadLen := payload.Len() - AuthSize authBytes := payload.BytesFrom(payloadLen) + authenticator = NewAuthenticator(HeaderKeyGenerator(account.Key, iv)) actualAuth := make([]byte, AuthSize) authenticator.Authenticate(payload.BytesTo(payloadLen))(actualAuth) if !bytes.Equal(actualAuth, authBytes) { From 6c41efe3af4cd4a15a410f7a47b2ad7ab89f7e7f Mon Sep 17 00:00:00 2001 From: DarienRaymond Date: Mon, 27 Nov 2017 13:09:40 +0100 Subject: [PATCH 205/229] Create CODE_OF_CONDUCT.md --- CODE_OF_CONDUCT.md | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..ea7e1ce8 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,46 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at love@v2ray.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ From 6f1ddec78c4ad5325bdae6d84ad95c310951acbf Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Mon, 27 Nov 2017 17:34:39 +0100 Subject: [PATCH 206/229] support file --- .../CODE_OF_CONDUCT.md | 0 .github/SUPPORT.md | 66 +++++++++++++++++++ 2 files changed, 66 insertions(+) rename CODE_OF_CONDUCT.md => .github/CODE_OF_CONDUCT.md (100%) create mode 100644 .github/SUPPORT.md diff --git a/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md similarity index 100% rename from CODE_OF_CONDUCT.md rename to .github/CODE_OF_CONDUCT.md diff --git a/.github/SUPPORT.md b/.github/SUPPORT.md new file mode 100644 index 00000000..d62eb572 --- /dev/null +++ b/.github/SUPPORT.md @@ -0,0 +1,66 @@ +# V2Ray 用户支持 (User Support) + +**English reader please skip to the English section below** + +## 获得帮助信息的途径 + +您可以从以下渠道获取帮助: + +1. 官方网站:[v2ray.com](https://www.v2ray.com) +1. Github:[Issues](https://github.com/v2ray/v2ray-core/issues) +1. Telegram:[主群](https://t.me/projectv2ray) + +## Github Issue 规则 + +1. 请按模板填写 issue; +1. 配置文件内容使用格式化代码段进行修饰(见下面的解释); +1. 在提交 issue 前尝试减化配置文件(如下): + * 删除不必要 inbound / outbound 模块; + * 删除不必要的路由项; +1. 在提交 issue 前尝试确定问题所在,比如: + * 将 socks 代理换成 http 再次观察问题是否能重现; + * 更改加密方式再次观察问题是否能重现; +1. 配置文件必须结构完整,即除了必要的隐私信息之外,配置文件可以直接拿来运行。 + +**不按模板填写的 issue 将直接被关闭** + +## 格式化代码段 + +在配置文件上下加入 Markdown 特定的修饰符,如下: + +\`\`\`javascript +{ + // 配置文件内容 +} +\`\`\` + +## Way to Get Support + +You may get help in the following ways: + +1. Office Site: [v2ray.com](https://www.v2ray.com) +1. Github: [Issues](https://github.com/v2ray/v2ray-core/issues) +1. Telegram: [Main Group](https://t.me/projectv2ray) + +## Github Issue Rules + +1. Please fill in the issue template. +1. Decorate config file with Markdown formatter (See below). +1. Try to simplify config file before submitting the issue, such as: + * Removing unnecessary inbound / outbound blocks. + * Removing unnecessary routing rules. +1. Try to determine the cause of the issue, for example: + * Replacing socks inbound with http inbound to see if the issue still exists. + * Changing encryption methods to see if the issue still exists. + +**Any issue not following the issue template will be closed immediately.** + +## Code formatter + +Add the following Markdown decorator to config file content: + +\`\`\`javascript +{ + // config file +} +\`\`\` From b507828d1fc5a7b8027c1dc670f13fd4601aecde Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Mon, 27 Nov 2017 17:36:21 +0100 Subject: [PATCH 207/229] update support file --- .github/SUPPORT.md | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/.github/SUPPORT.md b/.github/SUPPORT.md index d62eb572..9ebb7cae 100644 --- a/.github/SUPPORT.md +++ b/.github/SUPPORT.md @@ -15,11 +15,11 @@ 1. 请按模板填写 issue; 1. 配置文件内容使用格式化代码段进行修饰(见下面的解释); 1. 在提交 issue 前尝试减化配置文件(如下): - * 删除不必要 inbound / outbound 模块; - * 删除不必要的路由项; + 1. 删除不必要 inbound / outbound 模块; + 1. 删除不必要的路由项; 1. 在提交 issue 前尝试确定问题所在,比如: - * 将 socks 代理换成 http 再次观察问题是否能重现; - * 更改加密方式再次观察问题是否能重现; + 1. 将 socks 代理换成 http 再次观察问题是否能重现; + 1. 更改加密方式再次观察问题是否能重现; 1. 配置文件必须结构完整,即除了必要的隐私信息之外,配置文件可以直接拿来运行。 **不按模板填写的 issue 将直接被关闭** @@ -29,9 +29,11 @@ 在配置文件上下加入 Markdown 特定的修饰符,如下: \`\`\`javascript + { // 配置文件内容 } + \`\`\` ## Way to Get Support @@ -47,11 +49,12 @@ You may get help in the following ways: 1. Please fill in the issue template. 1. Decorate config file with Markdown formatter (See below). 1. Try to simplify config file before submitting the issue, such as: - * Removing unnecessary inbound / outbound blocks. - * Removing unnecessary routing rules. + 1. Removing unnecessary inbound / outbound blocks. + 1. Removing unnecessary routing rules. 1. Try to determine the cause of the issue, for example: - * Replacing socks inbound with http inbound to see if the issue still exists. - * Changing encryption methods to see if the issue still exists. + 1. Replacing socks inbound with http inbound to see if the issue still exists. + 1. Changing encryption methods to see if the issue still exists. +1. Config file must be structurally complete. **Any issue not following the issue template will be closed immediately.** @@ -60,7 +63,9 @@ You may get help in the following ways: Add the following Markdown decorator to config file content: \`\`\`javascript + { // config file } + \`\`\` From a66d7ff6195d4d1d37c876a15db24d400ac6135a Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Mon, 27 Nov 2017 17:37:47 +0100 Subject: [PATCH 208/229] update format --- .github/SUPPORT.md | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/.github/SUPPORT.md b/.github/SUPPORT.md index 9ebb7cae..13f1e52f 100644 --- a/.github/SUPPORT.md +++ b/.github/SUPPORT.md @@ -14,12 +14,8 @@ 1. 请按模板填写 issue; 1. 配置文件内容使用格式化代码段进行修饰(见下面的解释); -1. 在提交 issue 前尝试减化配置文件(如下): - 1. 删除不必要 inbound / outbound 模块; - 1. 删除不必要的路由项; -1. 在提交 issue 前尝试确定问题所在,比如: - 1. 将 socks 代理换成 http 再次观察问题是否能重现; - 1. 更改加密方式再次观察问题是否能重现; +1. 在提交 issue 前尝试减化配置文件,比如删除不必要 inbound / outbound 模块; +1. 在提交 issue 前尝试确定问题所在,比如将 socks 代理换成 http 再次观察问题是否能重现; 1. 配置文件必须结构完整,即除了必要的隐私信息之外,配置文件可以直接拿来运行。 **不按模板填写的 issue 将直接被关闭** @@ -48,12 +44,8 @@ You may get help in the following ways: 1. Please fill in the issue template. 1. Decorate config file with Markdown formatter (See below). -1. Try to simplify config file before submitting the issue, such as: - 1. Removing unnecessary inbound / outbound blocks. - 1. Removing unnecessary routing rules. -1. Try to determine the cause of the issue, for example: - 1. Replacing socks inbound with http inbound to see if the issue still exists. - 1. Changing encryption methods to see if the issue still exists. +1. Try to simplify config file before submitting the issue, such as removing unnecessary inbound / outbound blocks. +1. Try to determine the cause of the issue, for example, replacing socks inbound with http inbound to see if the issue still exists. 1. Config file must be structurally complete. **Any issue not following the issue template will be closed immediately.** From d4f8934aa499610d817862334f189e5f2cd14f10 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Mon, 27 Nov 2017 17:38:28 +0100 Subject: [PATCH 209/229] update link --- .github/SUPPORT.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/SUPPORT.md b/.github/SUPPORT.md index 13f1e52f..36212225 100644 --- a/.github/SUPPORT.md +++ b/.github/SUPPORT.md @@ -1,6 +1,6 @@ # V2Ray 用户支持 (User Support) -**English reader please skip to the English section below** +**English reader please skip to the [English section](#way-to-get-support) below** ## 获得帮助信息的途径 From 3214a5078cda8c42f777e5961a154a6e9d4d5de8 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Mon, 27 Nov 2017 22:09:30 +0100 Subject: [PATCH 210/229] customizable policy --- app/dns/server/server_test.go | 3 + app/policy/config.go | 15 ++++ app/policy/config.pb.go | 140 +++++++++++++++++++++++++++++++ app/policy/config.proto | 27 ++++++ app/policy/manager/manager.go | 62 ++++++++++++++ app/policy/policy.go | 17 ++++ common/protocol/user.go | 19 ----- main/distro/all/all.go | 1 + proxy/dokodemo/config.pb.go | 48 ++++++----- proxy/dokodemo/config.proto | 3 +- proxy/dokodemo/dokodemo.go | 25 ++++-- proxy/freedom/config.pb.go | 52 +++++++----- proxy/freedom/config.proto | 3 +- proxy/freedom/freedom.go | 19 +++-- proxy/http/config.pb.go | 46 ++++++---- proxy/http/config.proto | 3 +- proxy/http/server.go | 24 ++++-- proxy/shadowsocks/client.go | 23 ++++- proxy/shadowsocks/config.proto | 2 +- proxy/shadowsocks/server.go | 26 ++++-- proxy/socks/config.pb.go | 69 ++++++++------- proxy/socks/config.proto | 5 +- proxy/socks/server.go | 24 ++++-- proxy/vmess/inbound/inbound.go | 17 +++- proxy/vmess/outbound/outbound.go | 20 ++++- v2ray.go | 20 ++++- 26 files changed, 554 insertions(+), 159 deletions(-) create mode 100644 app/policy/config.go create mode 100644 app/policy/config.pb.go create mode 100644 app/policy/config.proto create mode 100644 app/policy/manager/manager.go create mode 100644 app/policy/policy.go diff --git a/app/dns/server/server_test.go b/app/dns/server/server_test.go index 8a30b361..daaae9db 100644 --- a/app/dns/server/server_test.go +++ b/app/dns/server/server_test.go @@ -9,6 +9,8 @@ import ( _ "v2ray.com/core/app/dispatcher/impl" . "v2ray.com/core/app/dns" _ "v2ray.com/core/app/dns/server" + "v2ray.com/core/app/policy" + _ "v2ray.com/core/app/policy/manager" "v2ray.com/core/app/proxyman" _ "v2ray.com/core/app/proxyman/outbound" "v2ray.com/core/common" @@ -74,6 +76,7 @@ func TestUDPServer(t *testing.T) { common.Must(app.AddApplicationToSpace(ctx, config)) common.Must(app.AddApplicationToSpace(ctx, &dispatcher.Config{})) common.Must(app.AddApplicationToSpace(ctx, &proxyman.OutboundConfig{})) + common.Must(app.AddApplicationToSpace(ctx, &policy.Config{})) om := proxyman.OutboundHandlerManagerFromSpace(space) om.AddHandler(ctx, &proxyman.OutboundHandlerConfig{ diff --git a/app/policy/config.go b/app/policy/config.go new file mode 100644 index 00000000..073ce9f2 --- /dev/null +++ b/app/policy/config.go @@ -0,0 +1,15 @@ +package policy + +import ( + "time" + + "github.com/golang/protobuf/proto" +) + +func (s *Second) Duration() time.Duration { + return time.Second * time.Duration(s.Value) +} + +func (p *Policy) OverrideWith(another *Policy) { + proto.Merge(p, another) +} diff --git a/app/policy/config.pb.go b/app/policy/config.pb.go new file mode 100644 index 00000000..98063a4b --- /dev/null +++ b/app/policy/config.pb.go @@ -0,0 +1,140 @@ +package policy + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type Second struct { + Value uint32 `protobuf:"varint,1,opt,name=value" json:"value,omitempty"` +} + +func (m *Second) Reset() { *m = Second{} } +func (m *Second) String() string { return proto.CompactTextString(m) } +func (*Second) ProtoMessage() {} +func (*Second) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } + +func (m *Second) GetValue() uint32 { + if m != nil { + return m.Value + } + return 0 +} + +type Policy struct { + Timeout *Policy_Timeout `protobuf:"bytes,1,opt,name=timeout" json:"timeout,omitempty"` +} + +func (m *Policy) Reset() { *m = Policy{} } +func (m *Policy) String() string { return proto.CompactTextString(m) } +func (*Policy) ProtoMessage() {} +func (*Policy) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } + +func (m *Policy) GetTimeout() *Policy_Timeout { + if m != nil { + return m.Timeout + } + return nil +} + +// Timeout is a message for timeout settings in various stages, in seconds. +type Policy_Timeout struct { + Handshake *Second `protobuf:"bytes,1,opt,name=handshake" json:"handshake,omitempty"` + ConnectionIdle *Second `protobuf:"bytes,2,opt,name=connection_idle,json=connectionIdle" json:"connection_idle,omitempty"` + UplinkOnly *Second `protobuf:"bytes,3,opt,name=uplink_only,json=uplinkOnly" json:"uplink_only,omitempty"` + DownlinkOnly *Second `protobuf:"bytes,4,opt,name=downlink_only,json=downlinkOnly" json:"downlink_only,omitempty"` +} + +func (m *Policy_Timeout) Reset() { *m = Policy_Timeout{} } +func (m *Policy_Timeout) String() string { return proto.CompactTextString(m) } +func (*Policy_Timeout) ProtoMessage() {} +func (*Policy_Timeout) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1, 0} } + +func (m *Policy_Timeout) GetHandshake() *Second { + if m != nil { + return m.Handshake + } + return nil +} + +func (m *Policy_Timeout) GetConnectionIdle() *Second { + if m != nil { + return m.ConnectionIdle + } + return nil +} + +func (m *Policy_Timeout) GetUplinkOnly() *Second { + if m != nil { + return m.UplinkOnly + } + return nil +} + +func (m *Policy_Timeout) GetDownlinkOnly() *Second { + if m != nil { + return m.DownlinkOnly + } + return nil +} + +type Config struct { + Level map[uint32]*Policy `protobuf:"bytes,1,rep,name=level" json:"level,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` +} + +func (m *Config) Reset() { *m = Config{} } +func (m *Config) String() string { return proto.CompactTextString(m) } +func (*Config) ProtoMessage() {} +func (*Config) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } + +func (m *Config) GetLevel() map[uint32]*Policy { + if m != nil { + return m.Level + } + return nil +} + +func init() { + proto.RegisterType((*Second)(nil), "v2ray.core.app.policy.Second") + proto.RegisterType((*Policy)(nil), "v2ray.core.app.policy.Policy") + proto.RegisterType((*Policy_Timeout)(nil), "v2ray.core.app.policy.Policy.Timeout") + proto.RegisterType((*Config)(nil), "v2ray.core.app.policy.Config") +} + +func init() { proto.RegisterFile("v2ray.com/core/app/policy/config.proto", fileDescriptor0) } + +var fileDescriptor0 = []byte{ + // 349 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0xc1, 0x4a, 0xeb, 0x40, + 0x14, 0x86, 0x49, 0x7a, 0x9b, 0x72, 0x4f, 0x6f, 0xaf, 0x32, 0x58, 0x88, 0x05, 0xa5, 0x14, 0x94, + 0xae, 0x26, 0x90, 0x6e, 0x44, 0xb1, 0x62, 0x45, 0x41, 0x10, 0x2c, 0x51, 0x14, 0xdc, 0x94, 0x71, + 0x32, 0xda, 0xd0, 0xe9, 0x9c, 0x21, 0xa6, 0x95, 0xbc, 0x86, 0x6f, 0xe0, 0xd6, 0x87, 0xf2, 0x59, + 0x24, 0x99, 0x84, 0x6c, 0x5a, 0xe9, 0x6e, 0x72, 0xf8, 0xfe, 0x8f, 0x43, 0xfe, 0x03, 0x87, 0x4b, + 0x3f, 0x66, 0x29, 0xe5, 0x38, 0xf7, 0x38, 0xc6, 0xc2, 0x63, 0x5a, 0x7b, 0x1a, 0x65, 0xc4, 0x53, + 0x8f, 0xa3, 0x7a, 0x89, 0x5e, 0xa9, 0x8e, 0x31, 0x41, 0xd2, 0x2e, 0xb9, 0x58, 0x50, 0xa6, 0x35, + 0x35, 0x4c, 0x6f, 0x1f, 0x9c, 0x3b, 0xc1, 0x51, 0x85, 0x64, 0x07, 0xea, 0x4b, 0x26, 0x17, 0xc2, + 0xb5, 0xba, 0x56, 0xbf, 0x15, 0x98, 0x8f, 0xde, 0xb7, 0x0d, 0xce, 0x38, 0x47, 0xc9, 0x19, 0x34, + 0x92, 0x68, 0x2e, 0x70, 0x91, 0xe4, 0x48, 0xd3, 0x3f, 0xa0, 0x2b, 0x9d, 0xd4, 0xf0, 0xf4, 0xde, + 0xc0, 0x41, 0x99, 0xea, 0x7c, 0xd8, 0xd0, 0x28, 0x86, 0xe4, 0x04, 0xfe, 0x4e, 0x99, 0x0a, 0xdf, + 0xa6, 0x6c, 0x26, 0x0a, 0xdd, 0xde, 0x1a, 0x9d, 0xd9, 0x2f, 0xa8, 0x78, 0x72, 0x05, 0x5b, 0x1c, + 0x95, 0x12, 0x3c, 0x89, 0x50, 0x4d, 0xa2, 0x50, 0x0a, 0xd7, 0xde, 0x44, 0xf1, 0xbf, 0x4a, 0x5d, + 0x87, 0x52, 0x90, 0x21, 0x34, 0x17, 0x5a, 0x46, 0x6a, 0x36, 0x41, 0x25, 0x53, 0xb7, 0xb6, 0x89, + 0x03, 0x4c, 0xe2, 0x56, 0xc9, 0x94, 0x8c, 0xa0, 0x15, 0xe2, 0xbb, 0xaa, 0x0c, 0x7f, 0x36, 0x31, + 0xfc, 0x2b, 0x33, 0x99, 0xa3, 0xf7, 0x69, 0x81, 0x73, 0x91, 0x17, 0x45, 0x86, 0x50, 0x97, 0x62, + 0x29, 0xa4, 0x6b, 0x75, 0x6b, 0xfd, 0xa6, 0xdf, 0x5f, 0xa3, 0x31, 0x34, 0xbd, 0xc9, 0xd0, 0x4b, + 0x95, 0xc4, 0x69, 0x60, 0x62, 0x9d, 0x47, 0x80, 0x6a, 0x48, 0xb6, 0xa1, 0x36, 0x13, 0x69, 0xd1, + 0x66, 0xf6, 0x24, 0x83, 0xb2, 0xe1, 0xdf, 0x7f, 0x96, 0xa9, 0xaf, 0x38, 0x80, 0x63, 0xfb, 0xc8, + 0x1a, 0x9d, 0xc2, 0x2e, 0xc7, 0xf9, 0x6a, 0x7c, 0x6c, 0x3d, 0x39, 0xe6, 0xf5, 0x65, 0xb7, 0x1f, + 0xfc, 0x80, 0x65, 0x0b, 0xc6, 0x82, 0x9e, 0x6b, 0x5d, 0x98, 0x9e, 0x9d, 0xfc, 0x02, 0x07, 0x3f, + 0x01, 0x00, 0x00, 0xff, 0xff, 0xcf, 0x25, 0x25, 0xc2, 0xab, 0x02, 0x00, 0x00, +} diff --git a/app/policy/config.proto b/app/policy/config.proto new file mode 100644 index 00000000..b00aefc5 --- /dev/null +++ b/app/policy/config.proto @@ -0,0 +1,27 @@ +syntax = "proto3"; + +package v2ray.core.app.policy; +option csharp_namespace = "V2Ray.Core.App.Policy"; +option go_package = "policy"; +option java_package = "com.v2ray.core.app.policy"; +option java_multiple_files = true; + +message Second { + uint32 value = 1; +} + +message Policy { + // Timeout is a message for timeout settings in various stages, in seconds. + message Timeout { + Second handshake = 1; + Second connection_idle = 2; + Second uplink_only = 3; + Second downlink_only = 4; + } + + Timeout timeout = 1; +} + +message Config { + map level = 1; +} diff --git a/app/policy/manager/manager.go b/app/policy/manager/manager.go new file mode 100644 index 00000000..73ec14f8 --- /dev/null +++ b/app/policy/manager/manager.go @@ -0,0 +1,62 @@ +package manager + +import ( + "context" + + "v2ray.com/core/app/policy" + "v2ray.com/core/common" +) + +type Instance struct { + levels map[uint32]*policy.Policy +} + +func New(ctx context.Context, config *policy.Config) (*Instance, error) { + levels := config.Level + if levels == nil { + levels = make(map[uint32]*policy.Policy) + } + for _, p := range levels { + g := global() + g.OverrideWith(p) + *p = g + } + return &Instance{ + levels: levels, + }, nil +} + +func global() policy.Policy { + return policy.Policy{ + Timeout: &policy.Policy_Timeout{ + Handshake: &policy.Second{Value: 4}, + ConnectionIdle: &policy.Second{Value: 300}, + UplinkOnly: &policy.Second{Value: 5}, + DownlinkOnly: &policy.Second{Value: 30}, + }, + } +} + +func (m *Instance) GetPolicy(level uint32) policy.Policy { + if p, ok := m.levels[level]; ok { + return *p + } + return global() +} + +func (m *Instance) Start() error { + return nil +} + +func (m *Instance) Close() { +} + +func (m *Instance) Interface() interface{} { + return (*policy.Interface)(nil) +} + +func init() { + common.Must(common.RegisterConfig((*policy.Config)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { + return New(ctx, config.(*policy.Config)) + })) +} diff --git a/app/policy/policy.go b/app/policy/policy.go new file mode 100644 index 00000000..1849a5ff --- /dev/null +++ b/app/policy/policy.go @@ -0,0 +1,17 @@ +package policy + +import ( + "v2ray.com/core/app" +) + +type Interface interface { + GetPolicy(level uint32) Policy +} + +func PolicyFromSpace(space app.Space) Interface { + app := space.GetApplication((*Interface)(nil)) + if app == nil { + return nil + } + return app.(Interface) +} diff --git a/common/protocol/user.go b/common/protocol/user.go index 3ae45019..07f08ef9 100644 --- a/common/protocol/user.go +++ b/common/protocol/user.go @@ -1,7 +1,5 @@ package protocol -import "time" - func (u *User) GetTypedAccount() (Account, error) { if u.GetAccount() == nil { return nil, newError("Account missing").AtWarning() @@ -19,20 +17,3 @@ func (u *User) GetTypedAccount() (Account, error) { } return nil, newError("Unknown account type: ", u.Account.Type) } - -func (u *User) GetSettings() UserSettings { - settings := UserSettings{} - switch u.Level { - case 0: - settings.PayloadTimeout = time.Second * 30 - case 1: - settings.PayloadTimeout = time.Minute * 2 - default: - settings.PayloadTimeout = time.Minute * 5 - } - return settings -} - -type UserSettings struct { - PayloadTimeout time.Duration -} diff --git a/main/distro/all/all.go b/main/distro/all/all.go index 8b51f1d1..800853bb 100644 --- a/main/distro/all/all.go +++ b/main/distro/all/all.go @@ -4,6 +4,7 @@ import ( // The following are necessary as they register handlers in their init functions. _ "v2ray.com/core/app/dispatcher/impl" _ "v2ray.com/core/app/dns/server" + _ "v2ray.com/core/app/policy/manager" _ "v2ray.com/core/app/proxyman/inbound" _ "v2ray.com/core/app/proxyman/outbound" _ "v2ray.com/core/app/router" diff --git a/proxy/dokodemo/config.pb.go b/proxy/dokodemo/config.pb.go index f4e8d36f..c55306b8 100644 --- a/proxy/dokodemo/config.pb.go +++ b/proxy/dokodemo/config.pb.go @@ -23,6 +23,7 @@ type Config struct { NetworkList *v2ray_core_common_net1.NetworkList `protobuf:"bytes,3,opt,name=network_list,json=networkList" json:"network_list,omitempty"` Timeout uint32 `protobuf:"varint,4,opt,name=timeout" json:"timeout,omitempty"` FollowRedirect bool `protobuf:"varint,5,opt,name=follow_redirect,json=followRedirect" json:"follow_redirect,omitempty"` + UserLevel uint32 `protobuf:"varint,6,opt,name=user_level,json=userLevel" json:"user_level,omitempty"` } func (m *Config) Reset() { *m = Config{} } @@ -65,6 +66,13 @@ func (m *Config) GetFollowRedirect() bool { return false } +func (m *Config) GetUserLevel() uint32 { + if m != nil { + return m.UserLevel + } + return 0 +} + func init() { proto.RegisterType((*Config)(nil), "v2ray.core.proxy.dokodemo.Config") } @@ -72,23 +80,25 @@ func init() { func init() { proto.RegisterFile("v2ray.com/core/proxy/dokodemo/config.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 286 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xcf, 0x4a, 0x03, 0x31, - 0x10, 0x87, 0x49, 0xad, 0x6d, 0x49, 0xfd, 0x03, 0x39, 0xa5, 0x82, 0x50, 0x7b, 0x69, 0xf1, 0x90, - 0x40, 0x3d, 0x7a, 0xb3, 0x15, 0x11, 0x44, 0x97, 0x1c, 0x3c, 0x78, 0x29, 0x6b, 0x36, 0x95, 0xd0, - 0x4d, 0x66, 0x99, 0x8d, 0xd6, 0x7d, 0x25, 0x5f, 0xcb, 0x17, 0x11, 0xb3, 0xbb, 0x28, 0x42, 0xbd, - 0xcd, 0x4c, 0xbe, 0x7c, 0x33, 0xfc, 0xe8, 0xf9, 0xdb, 0x1c, 0xd3, 0x4a, 0x68, 0x70, 0x52, 0x03, - 0x1a, 0x59, 0x20, 0xbc, 0x57, 0x32, 0x83, 0x0d, 0x64, 0xc6, 0x81, 0xd4, 0xe0, 0xd7, 0xf6, 0x45, - 0x14, 0x08, 0x01, 0xd8, 0xa8, 0x65, 0xd1, 0x88, 0xc8, 0x89, 0x96, 0x3b, 0x99, 0xfe, 0xd1, 0x68, - 0x70, 0x0e, 0xbc, 0xf4, 0x26, 0xc8, 0x34, 0xcb, 0xd0, 0x94, 0x65, 0xed, 0xf8, 0x0f, 0xf4, 0x26, - 0x6c, 0x01, 0x37, 0x35, 0x38, 0xf9, 0x24, 0xb4, 0xb7, 0x88, 0xdb, 0xd9, 0x25, 0xed, 0x37, 0x12, - 0x4e, 0xc6, 0x64, 0x36, 0x9c, 0x9f, 0x89, 0x5f, 0x97, 0xd4, 0x06, 0xe1, 0x4d, 0x10, 0xb7, 0xc9, - 0x03, 0x2e, 0xc1, 0xa5, 0xd6, 0xab, 0xf6, 0x07, 0x63, 0xb4, 0x5b, 0x00, 0x06, 0xde, 0x19, 0x93, - 0xd9, 0xa1, 0x8a, 0x35, 0xbb, 0xa6, 0x07, 0xcd, 0xb2, 0x55, 0x6e, 0xcb, 0xc0, 0xf7, 0xa2, 0x75, - 0xb2, 0xc3, 0x7a, 0x5f, 0xa3, 0x77, 0xb6, 0x0c, 0x6a, 0xe8, 0x7f, 0x1a, 0xc6, 0x69, 0x3f, 0x58, - 0x67, 0xe0, 0x35, 0xf0, 0x6e, 0xb4, 0xb7, 0x2d, 0x9b, 0xd2, 0xe3, 0x35, 0xe4, 0x39, 0x6c, 0x57, - 0x68, 0x32, 0x8b, 0x46, 0x07, 0xbe, 0x3f, 0x26, 0xb3, 0x81, 0x3a, 0xaa, 0xc7, 0xaa, 0x99, 0x5e, - 0xdd, 0xd0, 0x53, 0x0d, 0x4e, 0xec, 0x0c, 0x36, 0x21, 0x4f, 0x83, 0xb6, 0xfe, 0xe8, 0x8c, 0x1e, - 0xe7, 0x2a, 0xad, 0xc4, 0xe2, 0x9b, 0x4b, 0x22, 0xb7, 0x6c, 0xde, 0x9e, 0x7b, 0x31, 0xb5, 0x8b, - 0xaf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf9, 0x1c, 0xb0, 0xd9, 0xd0, 0x01, 0x00, 0x00, + // 310 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xcf, 0x4e, 0xc2, 0x40, + 0x10, 0x87, 0xd3, 0x8a, 0x80, 0x8b, 0x7f, 0x92, 0x3d, 0x2d, 0x46, 0x12, 0xe4, 0x02, 0xf1, 0xb0, + 0x4d, 0xf0, 0xe8, 0x0d, 0x30, 0xc6, 0x84, 0x28, 0xd9, 0x83, 0x07, 0x2f, 0xa4, 0xb6, 0x83, 0x69, + 0xe8, 0xee, 0x90, 0xe9, 0x02, 0xf6, 0x05, 0x7c, 0x18, 0x9f, 0xd2, 0x74, 0xdb, 0x46, 0x63, 0x82, + 0xb7, 0xd9, 0xdf, 0x7e, 0xf3, 0xcd, 0x64, 0xd8, 0xcd, 0x6e, 0x4c, 0x61, 0x2e, 0x23, 0xd4, 0x41, + 0x84, 0x04, 0xc1, 0x86, 0xf0, 0x23, 0x0f, 0x62, 0x5c, 0x63, 0x0c, 0x1a, 0x83, 0x08, 0xcd, 0x2a, + 0x79, 0x97, 0x1b, 0x42, 0x8b, 0xbc, 0x5b, 0xb3, 0x04, 0xd2, 0x71, 0xb2, 0xe6, 0x2e, 0x87, 0x7f, + 0x34, 0x11, 0x6a, 0x8d, 0x26, 0x30, 0x60, 0x83, 0x30, 0x8e, 0x09, 0xb2, 0xac, 0x74, 0xfc, 0x07, + 0x1a, 0xb0, 0x7b, 0xa4, 0x75, 0x09, 0x0e, 0x3e, 0x7d, 0xd6, 0x9c, 0xba, 0xe9, 0xfc, 0x8e, 0xb5, + 0x2a, 0x89, 0xf0, 0xfa, 0xde, 0xa8, 0x33, 0xbe, 0x96, 0xbf, 0x36, 0x29, 0x0d, 0xd2, 0x80, 0x95, + 0x8f, 0x8b, 0x67, 0x9a, 0xa1, 0x0e, 0x13, 0xa3, 0xea, 0x0e, 0xce, 0x59, 0x63, 0x83, 0x64, 0x85, + 0xdf, 0xf7, 0x46, 0x67, 0xca, 0xd5, 0xfc, 0x9e, 0x9d, 0x56, 0xc3, 0x96, 0x69, 0x92, 0x59, 0x71, + 0xe4, 0xac, 0x83, 0x03, 0xd6, 0xa7, 0x12, 0x9d, 0x27, 0x99, 0x55, 0x1d, 0xf3, 0xf3, 0xe0, 0x57, + 0xac, 0x65, 0x13, 0x0d, 0xb8, 0xb5, 0xa2, 0x51, 0xd8, 0x27, 0xbe, 0xf0, 0x54, 0x1d, 0xf1, 0x21, + 0xbb, 0x58, 0x61, 0x9a, 0xe2, 0x7e, 0x49, 0x10, 0x27, 0x04, 0x91, 0x15, 0xc7, 0x7d, 0x6f, 0xd4, + 0x56, 0xe7, 0x65, 0xac, 0xaa, 0x94, 0xf7, 0x18, 0xdb, 0x66, 0x40, 0xcb, 0x14, 0x76, 0x90, 0x8a, + 0xa6, 0xdb, 0xf3, 0xa4, 0x48, 0xe6, 0x45, 0x30, 0x79, 0x60, 0xbd, 0x08, 0xb5, 0x3c, 0x78, 0xfb, + 0x85, 0xf7, 0xda, 0xae, 0xeb, 0x2f, 0xbf, 0xfb, 0x32, 0x56, 0x61, 0x2e, 0xa7, 0x05, 0xb7, 0x70, + 0xdc, 0xac, 0xfa, 0x7b, 0x6b, 0xba, 0xc3, 0xde, 0x7e, 0x07, 0x00, 0x00, 0xff, 0xff, 0x33, 0x8e, + 0x70, 0xce, 0xf3, 0x01, 0x00, 0x00, } diff --git a/proxy/dokodemo/config.proto b/proxy/dokodemo/config.proto index d3cd6df1..19a07dcb 100644 --- a/proxy/dokodemo/config.proto +++ b/proxy/dokodemo/config.proto @@ -13,6 +13,7 @@ message Config { v2ray.core.common.net.IPOrDomain address = 1; uint32 port = 2; v2ray.core.common.net.NetworkList network_list = 3; - uint32 timeout = 4; + uint32 timeout = 4 [deprecated = true]; bool follow_redirect = 5; + uint32 user_level = 6; } \ No newline at end of file diff --git a/proxy/dokodemo/dokodemo.go b/proxy/dokodemo/dokodemo.go index a62a21bd..06410569 100644 --- a/proxy/dokodemo/dokodemo.go +++ b/proxy/dokodemo/dokodemo.go @@ -4,11 +4,11 @@ package dokodemo import ( "context" - "time" "v2ray.com/core/app" "v2ray.com/core/app/dispatcher" "v2ray.com/core/app/log" + "v2ray.com/core/app/policy" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" @@ -22,6 +22,7 @@ type DokodemoDoor struct { config *Config address net.Address port net.Port + policy policy.Policy } func New(ctx context.Context, config *Config) (*DokodemoDoor, error) { @@ -37,6 +38,17 @@ func New(ctx context.Context, config *Config) (*DokodemoDoor, error) { address: config.GetPredefinedAddress(), port: net.Port(config.Port), } + space.OnInitialize(func() error { + pm := policy.PolicyFromSpace(space) + if pm == nil { + return newError("Policy not found in space.") + } + d.policy = pm.GetPolicy(config.UserLevel) + if config.Timeout > 0 && config.UserLevel == 0 { + d.policy.Timeout.ConnectionIdle.Value = config.Timeout + } + return nil + }) return d, nil } @@ -60,13 +72,8 @@ func (d *DokodemoDoor) Process(ctx context.Context, network net.Network, conn in return newError("unable to get destination") } - timeout := time.Second * time.Duration(d.config.Timeout) - if timeout == 0 { - timeout = time.Minute * 5 - } - ctx, cancel := context.WithCancel(ctx) - timer := signal.CancelAfterInactivity(ctx, cancel, timeout) + timer := signal.CancelAfterInactivity(ctx, cancel, d.policy.Timeout.ConnectionIdle.Duration()) inboundRay, err := dispatcher.Dispatch(ctx, dest) if err != nil { @@ -82,6 +89,8 @@ func (d *DokodemoDoor) Process(ctx context.Context, network net.Network, conn in return newError("failed to transport request").Base(err) } + timer.SetTimeout(d.policy.Timeout.DownlinkOnly.Duration()) + return nil }) @@ -107,7 +116,7 @@ func (d *DokodemoDoor) Process(ctx context.Context, network net.Network, conn in return newError("failed to transport response").Base(err) } - timer.SetTimeout(time.Second * 2) + timer.SetTimeout(d.policy.Timeout.UplinkOnly.Duration()) return nil }) diff --git a/proxy/freedom/config.pb.go b/proxy/freedom/config.pb.go index cd1e925d..7da98e3e 100644 --- a/proxy/freedom/config.pb.go +++ b/proxy/freedom/config.pb.go @@ -57,6 +57,7 @@ type Config struct { DomainStrategy Config_DomainStrategy `protobuf:"varint,1,opt,name=domain_strategy,json=domainStrategy,enum=v2ray.core.proxy.freedom.Config_DomainStrategy" json:"domain_strategy,omitempty"` Timeout uint32 `protobuf:"varint,2,opt,name=timeout" json:"timeout,omitempty"` DestinationOverride *DestinationOverride `protobuf:"bytes,3,opt,name=destination_override,json=destinationOverride" json:"destination_override,omitempty"` + UserLevel uint32 `protobuf:"varint,4,opt,name=user_level,json=userLevel" json:"user_level,omitempty"` } func (m *Config) Reset() { *m = Config{} } @@ -85,6 +86,13 @@ func (m *Config) GetDestinationOverride() *DestinationOverride { return nil } +func (m *Config) GetUserLevel() uint32 { + if m != nil { + return m.UserLevel + } + return 0 +} + func init() { proto.RegisterType((*DestinationOverride)(nil), "v2ray.core.proxy.freedom.DestinationOverride") proto.RegisterType((*Config)(nil), "v2ray.core.proxy.freedom.Config") @@ -94,25 +102,27 @@ func init() { func init() { proto.RegisterFile("v2ray.com/core/proxy/freedom/config.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 318 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x90, 0xcf, 0x4a, 0xc3, 0x40, - 0x10, 0xc6, 0x4d, 0xc5, 0x14, 0x47, 0xac, 0x65, 0xeb, 0x21, 0x88, 0x87, 0xd2, 0x8b, 0x55, 0x70, - 0x23, 0xf1, 0x09, 0xec, 0x1f, 0xa1, 0x27, 0x4b, 0x82, 0xa2, 0x5e, 0x62, 0xcc, 0x4e, 0xcb, 0x82, - 0xd9, 0x09, 0x9b, 0xb5, 0x98, 0x27, 0xf0, 0x5d, 0x7c, 0x4a, 0x71, 0x93, 0xa2, 0x55, 0x73, 0xdb, - 0x99, 0xfd, 0x7d, 0xdf, 0xcc, 0x37, 0x70, 0xba, 0x0a, 0x74, 0x52, 0xf2, 0x94, 0x32, 0x3f, 0x25, - 0x8d, 0x7e, 0xae, 0xe9, 0xad, 0xf4, 0x17, 0x1a, 0x51, 0xd8, 0x96, 0x5a, 0xc8, 0x25, 0xcf, 0x35, - 0x19, 0x62, 0xde, 0x1a, 0xd5, 0xc8, 0x2d, 0xc6, 0x6b, 0xec, 0xe8, 0xe2, 0x97, 0x49, 0x4a, 0x59, - 0x46, 0xca, 0xb7, 0xb2, 0x94, 0x5e, 0xfc, 0x02, 0xf5, 0x0a, 0x75, 0x5c, 0xe4, 0x98, 0x56, 0x5e, - 0x83, 0x07, 0xe8, 0x4d, 0xb0, 0x30, 0x52, 0x25, 0x46, 0x92, 0xba, 0x59, 0xa1, 0xd6, 0x52, 0x20, - 0x1b, 0x81, 0x5b, 0xb1, 0x9e, 0xd3, 0x77, 0x86, 0x7b, 0xc1, 0x19, 0xff, 0x31, 0xb3, 0x72, 0xe5, - 0x6b, 0x57, 0x1e, 0x59, 0x72, 0xaa, 0x44, 0x4e, 0x52, 0x99, 0xb0, 0x56, 0x0e, 0xde, 0x5b, 0xe0, - 0x8e, 0xed, 0xde, 0xec, 0x1e, 0x0e, 0x04, 0x65, 0x89, 0x54, 0x71, 0x61, 0x74, 0x62, 0x70, 0x59, - 0x5a, 0xdf, 0x4e, 0xe0, 0xf3, 0xa6, 0x2c, 0xbc, 0x92, 0xf2, 0x89, 0xd5, 0x45, 0xb5, 0x2c, 0xec, - 0x88, 0x8d, 0x9a, 0x79, 0xd0, 0x36, 0x32, 0x43, 0x7a, 0x35, 0x5e, 0xab, 0xef, 0x0c, 0xf7, 0xc3, - 0x75, 0xc9, 0x9e, 0xe0, 0x50, 0x7c, 0x27, 0x8b, 0xa9, 0x8e, 0xe6, 0x6d, 0xdb, 0x40, 0xe7, 0xcd, - 0x83, 0xff, 0xb9, 0x47, 0xd8, 0x13, 0x7f, 0x9b, 0x83, 0x13, 0xe8, 0x6c, 0x6e, 0xc7, 0x76, 0x61, - 0xe7, 0x2a, 0x8a, 0x67, 0x51, 0x77, 0x8b, 0x01, 0xb8, 0xb7, 0xd1, 0x34, 0x9e, 0xcd, 0xbb, 0xce, - 0x68, 0x02, 0xc7, 0x29, 0x65, 0x8d, 0x13, 0xe7, 0xce, 0x63, 0xbb, 0x7e, 0x7e, 0xb4, 0xbc, 0xbb, - 0x20, 0x4c, 0x4a, 0x3e, 0xfe, 0xa2, 0xe6, 0x96, 0xba, 0xae, 0xbe, 0x9e, 0x5d, 0x7b, 0xf0, 0xcb, - 0xcf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x45, 0xb3, 0x84, 0x2e, 0x2a, 0x02, 0x00, 0x00, + // 340 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x91, 0x6f, 0x4b, 0x83, 0x50, + 0x14, 0xc6, 0xd3, 0xca, 0xb1, 0x13, 0xad, 0xe1, 0x7a, 0x21, 0xb1, 0x60, 0xec, 0x4d, 0x2b, 0xe8, + 0x1a, 0xf6, 0x09, 0xda, 0x9f, 0x60, 0x10, 0x34, 0x94, 0xa2, 0x7a, 0x63, 0xa6, 0x67, 0x43, 0x98, + 0xf7, 0xc8, 0xf5, 0x4e, 0xf2, 0x2b, 0xed, 0x53, 0x86, 0x57, 0x47, 0x2d, 0xb6, 0x77, 0xfa, 0xf8, + 0x7b, 0x9e, 0x73, 0x9e, 0x23, 0x5c, 0xe7, 0x8e, 0x08, 0x0a, 0x16, 0x52, 0x62, 0x87, 0x24, 0xd0, + 0x4e, 0x05, 0x7d, 0x17, 0xf6, 0x5c, 0x20, 0x46, 0x4a, 0xe2, 0xf3, 0x78, 0xc1, 0x52, 0x41, 0x92, + 0x4c, 0x6b, 0x83, 0x0a, 0x64, 0x0a, 0x63, 0x35, 0x76, 0x71, 0xf7, 0x2f, 0x24, 0xa4, 0x24, 0x21, + 0x6e, 0x2b, 0x5b, 0x48, 0x4b, 0x3b, 0x43, 0x91, 0xa3, 0xf0, 0xb3, 0x14, 0xc3, 0x2a, 0xab, 0xff, + 0x0e, 0x9d, 0x31, 0x66, 0x32, 0xe6, 0x81, 0x8c, 0x89, 0x3f, 0xe7, 0x28, 0x44, 0x1c, 0xa1, 0x39, + 0x04, 0xa3, 0x62, 0x2d, 0xad, 0xa7, 0x0d, 0x4e, 0x9c, 0x1b, 0xf6, 0x67, 0x66, 0x95, 0xca, 0x36, + 0xa9, 0xcc, 0x53, 0xe4, 0x84, 0x47, 0x29, 0xc5, 0x5c, 0xba, 0xb5, 0xb3, 0xbf, 0xd6, 0xc1, 0x18, + 0xa9, 0xbd, 0xcd, 0x37, 0x38, 0x8b, 0x28, 0x09, 0x62, 0xee, 0x67, 0x52, 0x04, 0x12, 0x17, 0x85, + 0xca, 0x6d, 0x39, 0x36, 0xdb, 0xd7, 0x85, 0x55, 0x56, 0x36, 0x56, 0x3e, 0xaf, 0xb6, 0xb9, 0xad, + 0x68, 0xeb, 0xdd, 0xec, 0x42, 0x43, 0xc6, 0x09, 0xd2, 0x4a, 0x5a, 0x7a, 0x4f, 0x1b, 0x9c, 0x0e, + 0x75, 0x4b, 0x73, 0x37, 0x92, 0xf9, 0x09, 0xe7, 0xd1, 0x6f, 0x3b, 0x9f, 0xea, 0x7a, 0xd6, 0xa1, + 0x2a, 0x75, 0xbb, 0x7f, 0xf8, 0x8e, 0x9b, 0xb8, 0x9d, 0x68, 0xc7, 0xa1, 0x2e, 0x01, 0x56, 0x19, + 0x0a, 0x7f, 0x89, 0x39, 0x2e, 0xad, 0xa3, 0x72, 0x05, 0xb7, 0x59, 0x2a, 0x4f, 0xa5, 0xd0, 0xbf, + 0x82, 0xd6, 0x76, 0x01, 0xb3, 0x09, 0xc7, 0x0f, 0x9e, 0x3f, 0xf5, 0xda, 0x07, 0x26, 0x80, 0xf1, + 0xe2, 0x4d, 0xfc, 0xe9, 0xac, 0xad, 0x0d, 0xc7, 0xd0, 0x0d, 0x29, 0xd9, 0xbb, 0xd0, 0x4c, 0xfb, + 0x68, 0xd4, 0x8f, 0x6b, 0xdd, 0x7a, 0x75, 0xdc, 0xa0, 0x60, 0xa3, 0x92, 0x9a, 0x29, 0xea, 0xb1, + 0xfa, 0xf4, 0x65, 0xa8, 0x7f, 0x72, 0xff, 0x13, 0x00, 0x00, 0xff, 0xff, 0xb7, 0x5e, 0xda, 0x4d, + 0x4d, 0x02, 0x00, 0x00, } diff --git a/proxy/freedom/config.proto b/proxy/freedom/config.proto index ec4764e4..e90c78eb 100644 --- a/proxy/freedom/config.proto +++ b/proxy/freedom/config.proto @@ -18,6 +18,7 @@ message Config { USE_IP = 1; } DomainStrategy domain_strategy = 1; - uint32 timeout = 2; + uint32 timeout = 2 [deprecated = true]; DestinationOverride destination_override = 3; + uint32 user_level = 4; } diff --git a/proxy/freedom/freedom.go b/proxy/freedom/freedom.go index 028e7c25..d38bb618 100644 --- a/proxy/freedom/freedom.go +++ b/proxy/freedom/freedom.go @@ -4,11 +4,11 @@ package freedom import ( "context" - "time" "v2ray.com/core/app" "v2ray.com/core/app/dns" "v2ray.com/core/app/log" + "v2ray.com/core/app/policy" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/dice" @@ -26,6 +26,7 @@ type Handler struct { timeout uint32 dns dns.Server destOverride *DestinationOverride + policy policy.Policy } // New creates a new Freedom handler. @@ -46,6 +47,14 @@ func New(ctx context.Context, config *Config) (*Handler, error) { return newError("DNS server is not found in the space") } } + pm := policy.PolicyFromSpace(space) + if pm == nil { + return newError("Policy not found in space.") + } + f.policy = pm.GetPolicy(config.UserLevel) + if config.Timeout > 0 && config.UserLevel == 0 { + f.policy.Timeout.ConnectionIdle.Value = config.Timeout + } return nil }) return f, nil @@ -109,12 +118,8 @@ func (h *Handler) Process(ctx context.Context, outboundRay ray.OutboundRay, dial } defer conn.Close() - timeout := time.Second * time.Duration(h.timeout) - if timeout == 0 { - timeout = time.Minute * 5 - } ctx, cancel := context.WithCancel(ctx) - timer := signal.CancelAfterInactivity(ctx, cancel, timeout) + timer := signal.CancelAfterInactivity(ctx, cancel, h.policy.Timeout.ConnectionIdle.Duration()) requestDone := signal.ExecuteAsync(func() error { var writer buf.Writer @@ -126,6 +131,7 @@ func (h *Handler) Process(ctx context.Context, outboundRay ray.OutboundRay, dial if err := buf.Copy(input, writer, buf.UpdateActivity(timer)); err != nil { return newError("failed to process request").Base(err) } + timer.SetTimeout(h.policy.Timeout.DownlinkOnly.Duration()) return nil }) @@ -136,6 +142,7 @@ func (h *Handler) Process(ctx context.Context, outboundRay ray.OutboundRay, dial if err := buf.Copy(v2reader, output, buf.UpdateActivity(timer)); err != nil { return newError("failed to process response").Base(err) } + timer.SetTimeout(h.policy.Timeout.UplinkOnly.Duration()) return nil }) diff --git a/proxy/http/config.pb.go b/proxy/http/config.pb.go index 0b4170a5..3986458f 100644 --- a/proxy/http/config.pb.go +++ b/proxy/http/config.pb.go @@ -20,6 +20,7 @@ type ServerConfig struct { Timeout uint32 `protobuf:"varint,1,opt,name=timeout" json:"timeout,omitempty"` Accounts map[string]string `protobuf:"bytes,2,rep,name=accounts" json:"accounts,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` AllowTransparent bool `protobuf:"varint,3,opt,name=allow_transparent,json=allowTransparent" json:"allow_transparent,omitempty"` + UserLevel uint32 `protobuf:"varint,4,opt,name=user_level,json=userLevel" json:"user_level,omitempty"` } func (m *ServerConfig) Reset() { *m = ServerConfig{} } @@ -48,6 +49,13 @@ func (m *ServerConfig) GetAllowTransparent() bool { return false } +func (m *ServerConfig) GetUserLevel() uint32 { + if m != nil { + return m.UserLevel + } + return 0 +} + // ClientConfig for HTTP proxy client. type ClientConfig struct { } @@ -65,22 +73,24 @@ func init() { func init() { proto.RegisterFile("v2ray.com/core/proxy/http/config.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 271 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x90, 0x5d, 0x4b, 0xc3, 0x30, - 0x14, 0x86, 0x49, 0xe7, 0xc7, 0x8c, 0x9b, 0xcc, 0xe0, 0xa0, 0x7a, 0x55, 0x76, 0x21, 0x05, 0x21, - 0xc5, 0x7a, 0x23, 0xee, 0x4a, 0x8b, 0xe0, 0x8d, 0x30, 0xaa, 0x78, 0xe1, 0x8d, 0xc4, 0x10, 0xb5, - 0xd8, 0xe6, 0x94, 0xb3, 0xd3, 0x6a, 0xfe, 0x92, 0xff, 0xca, 0x7f, 0x22, 0xcd, 0x9c, 0x1f, 0xb0, - 0xab, 0xe4, 0x9c, 0xf7, 0xc9, 0xc3, 0x4b, 0xf8, 0x61, 0x9b, 0xa2, 0x72, 0x52, 0x43, 0x95, 0x68, - 0x40, 0x93, 0xd4, 0x08, 0xef, 0x2e, 0x79, 0x21, 0xaa, 0x13, 0x0d, 0xf6, 0xa9, 0x78, 0x96, 0x35, - 0x02, 0x81, 0x18, 0x2f, 0x39, 0x34, 0xd2, 0x33, 0xb2, 0x63, 0x26, 0x9f, 0x8c, 0x0f, 0x6e, 0x0c, - 0xb6, 0x06, 0x33, 0x4f, 0x8b, 0x90, 0x6f, 0x52, 0x51, 0x19, 0x68, 0x28, 0x64, 0x11, 0x8b, 0x87, - 0xf9, 0x72, 0x14, 0xd7, 0xbc, 0xaf, 0xb4, 0x86, 0xc6, 0xd2, 0x3c, 0x0c, 0xa2, 0x5e, 0xbc, 0x9d, - 0x1e, 0xcb, 0x95, 0x52, 0xf9, 0x57, 0x28, 0xcf, 0xbf, 0xdf, 0x5c, 0x5a, 0x42, 0x97, 0xff, 0x28, - 0xc4, 0x11, 0xdf, 0x55, 0x65, 0x09, 0x6f, 0x0f, 0x84, 0xca, 0xce, 0x6b, 0x85, 0xc6, 0x52, 0xd8, - 0x8b, 0x58, 0xdc, 0xcf, 0x47, 0x3e, 0xb8, 0xfd, 0xdd, 0x1f, 0x4c, 0xf9, 0xf0, 0x9f, 0x47, 0x8c, - 0x78, 0xef, 0xd5, 0x38, 0x5f, 0x71, 0x2b, 0xef, 0xae, 0x62, 0x8f, 0xaf, 0xb7, 0xaa, 0x6c, 0x4c, - 0x18, 0xf8, 0xdd, 0x62, 0x38, 0x0b, 0x4e, 0xd9, 0x64, 0x87, 0x0f, 0xb2, 0xb2, 0x30, 0x96, 0x16, - 0x8d, 0x2e, 0xa6, 0x7c, 0x5f, 0x43, 0xb5, 0xba, 0xfb, 0x8c, 0xdd, 0xaf, 0x75, 0xe7, 0x47, 0x30, - 0xbe, 0x4b, 0x73, 0xe5, 0x64, 0xd6, 0xe5, 0x33, 0x9f, 0x5f, 0x11, 0xd5, 0x8f, 0x1b, 0xfe, 0x3b, - 0x4f, 0xbe, 0x02, 0x00, 0x00, 0xff, 0xff, 0xf5, 0x08, 0xbc, 0x0a, 0x78, 0x01, 0x00, 0x00, + // 296 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x90, 0xcf, 0x4a, 0x33, 0x31, + 0x14, 0xc5, 0x99, 0x69, 0xbf, 0xcf, 0xf6, 0xda, 0x4a, 0x0d, 0x16, 0x46, 0x51, 0x28, 0x5d, 0x48, + 0x41, 0xc8, 0x60, 0xdd, 0x88, 0x5d, 0xd9, 0x22, 0xb8, 0x50, 0x28, 0x51, 0x5c, 0xb8, 0x29, 0x31, + 0x5c, 0xb5, 0x98, 0x26, 0x43, 0xe6, 0xce, 0xe8, 0xec, 0x7d, 0x1a, 0x9f, 0x52, 0x92, 0x5a, 0xff, + 0x40, 0x57, 0x49, 0x7e, 0xe7, 0xe4, 0xe4, 0x9e, 0xc0, 0x61, 0x39, 0x74, 0xb2, 0xe2, 0xca, 0x2e, + 0x52, 0x65, 0x1d, 0xa6, 0x99, 0xb3, 0x6f, 0x55, 0xfa, 0x4c, 0x94, 0xa5, 0xca, 0x9a, 0xc7, 0xf9, + 0x13, 0xcf, 0x9c, 0x25, 0xcb, 0xba, 0x2b, 0x9f, 0x43, 0x1e, 0x3c, 0xdc, 0x7b, 0xfa, 0xef, 0x31, + 0xb4, 0x6e, 0xd0, 0x95, 0xe8, 0x26, 0xc1, 0xcd, 0xf6, 0x61, 0x83, 0xe6, 0x0b, 0xb4, 0x05, 0x25, + 0x51, 0x2f, 0x1a, 0xb4, 0xc7, 0x71, 0x12, 0x89, 0x15, 0x62, 0xd7, 0xd0, 0x90, 0x4a, 0xd9, 0xc2, + 0x50, 0x9e, 0xc4, 0xbd, 0xda, 0x60, 0x73, 0x78, 0xcc, 0xd7, 0x06, 0xf3, 0xdf, 0xa1, 0xfc, 0xfc, + 0xeb, 0xce, 0x85, 0x21, 0x57, 0x89, 0xef, 0x08, 0x76, 0x04, 0xdb, 0x52, 0x6b, 0xfb, 0x3a, 0x23, + 0x27, 0x4d, 0x9e, 0x49, 0x87, 0x86, 0x92, 0x5a, 0x2f, 0x1a, 0x34, 0x44, 0x27, 0x08, 0xb7, 0x3f, + 0x9c, 0x1d, 0x00, 0x14, 0x39, 0xba, 0x99, 0xc6, 0x12, 0x75, 0x52, 0xf7, 0xc3, 0x89, 0xa6, 0x27, + 0x57, 0x1e, 0xec, 0x8d, 0xa0, 0xfd, 0xe7, 0x19, 0xd6, 0x81, 0xda, 0x0b, 0x56, 0xa1, 0x45, 0x53, + 0xf8, 0x2d, 0xdb, 0x81, 0x7f, 0xa5, 0xd4, 0x05, 0x26, 0x71, 0x60, 0xcb, 0xc3, 0x59, 0x7c, 0x1a, + 0xf5, 0xb7, 0xa0, 0x35, 0xd1, 0x73, 0x34, 0xb4, 0x1c, 0x78, 0x3c, 0x82, 0x5d, 0x65, 0x17, 0xeb, + 0xab, 0x4d, 0xa3, 0xfb, 0xba, 0x5f, 0x3f, 0xe2, 0xee, 0xdd, 0x50, 0xc8, 0x8a, 0x4f, 0xbc, 0x3e, + 0x0d, 0xfa, 0x25, 0x51, 0xf6, 0xf0, 0x3f, 0xfc, 0xf8, 0xc9, 0x67, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x69, 0x94, 0x9f, 0xa7, 0x9b, 0x01, 0x00, 0x00, } diff --git a/proxy/http/config.proto b/proxy/http/config.proto index a1d014e8..995737dd 100644 --- a/proxy/http/config.proto +++ b/proxy/http/config.proto @@ -8,9 +8,10 @@ option java_multiple_files = true; // Config for HTTP proxy server. message ServerConfig { - uint32 timeout = 1; + uint32 timeout = 1 [deprecated = true]; map accounts = 2; bool allow_transparent = 3; + uint32 user_level = 4; } // ClientConfig for HTTP proxy client. diff --git a/proxy/http/server.go b/proxy/http/server.go index 9e674950..e7e0b65e 100644 --- a/proxy/http/server.go +++ b/proxy/http/server.go @@ -13,6 +13,7 @@ import ( "v2ray.com/core/app" "v2ray.com/core/app/dispatcher" "v2ray.com/core/app/log" + "v2ray.com/core/app/policy" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/errors" @@ -24,6 +25,7 @@ import ( // Server is a HTTP proxy server. type Server struct { config *ServerConfig + policy policy.Policy } // NewServer creates a new HTTP inbound handler. @@ -35,6 +37,17 @@ func NewServer(ctx context.Context, config *ServerConfig) (*Server, error) { s := &Server{ config: config, } + space.OnInitialize(func() error { + pm := policy.PolicyFromSpace(space) + if pm == nil { + return newError("Policy not found in space.") + } + s.policy = pm.GetPolicy(config.UserLevel) + if config.Timeout > 0 && config.UserLevel == 0 { + s.policy.Timeout.ConnectionIdle.Value = config.Timeout + } + return nil + }) return s, nil } @@ -94,7 +107,7 @@ func (s *Server) Process(ctx context.Context, network net.Network, conn internet reader := bufio.NewReaderSize(readerOnly{conn}, buf.Size) Start: - conn.SetReadDeadline(time.Now().Add(time.Second * 16)) + conn.SetReadDeadline(time.Now().Add(s.policy.Timeout.Handshake.Duration())) request, err := http.ReadRequest(reader) if err != nil { @@ -157,12 +170,8 @@ func (s *Server) handleConnect(ctx context.Context, request *http.Request, reade return newError("failed to write back OK response").Base(err) } - timeout := time.Second * time.Duration(s.config.Timeout) - if timeout == 0 { - timeout = time.Minute * 5 - } ctx, cancel := context.WithCancel(ctx) - timer := signal.CancelAfterInactivity(ctx, cancel, timeout) + timer := signal.CancelAfterInactivity(ctx, cancel, s.policy.Timeout.ConnectionIdle.Duration()) ray, err := dispatcher.Dispatch(ctx, dest) if err != nil { return err @@ -181,6 +190,7 @@ func (s *Server) handleConnect(ctx context.Context, request *http.Request, reade requestDone := signal.ExecuteAsync(func() error { defer ray.InboundInput().Close() + defer timer.SetTimeout(s.policy.Timeout.DownlinkOnly.Duration()) v2reader := buf.NewReader(conn) return buf.Copy(v2reader, ray.InboundInput(), buf.UpdateActivity(timer)) @@ -191,7 +201,7 @@ func (s *Server) handleConnect(ctx context.Context, request *http.Request, reade if err := buf.Copy(ray.InboundOutput(), v2writer, buf.UpdateActivity(timer)); err != nil { return err } - timer.SetTimeout(time.Second * 2) + timer.SetTimeout(s.policy.Timeout.UplinkOnly.Duration()) return nil }) diff --git a/proxy/shadowsocks/client.go b/proxy/shadowsocks/client.go index e93ee370..473ecf62 100644 --- a/proxy/shadowsocks/client.go +++ b/proxy/shadowsocks/client.go @@ -2,9 +2,10 @@ package shadowsocks import ( "context" - "time" + "v2ray.com/core/app" "v2ray.com/core/app/log" + "v2ray.com/core/app/policy" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" @@ -18,7 +19,8 @@ import ( // Client is a inbound handler for Shadowsocks protocol type Client struct { - serverPicker protocol.ServerPicker + serverPicker protocol.ServerPicker + policyManager policy.Interface } // NewClient create a new Shadowsocks client. @@ -33,6 +35,18 @@ func NewClient(ctx context.Context, config *ClientConfig) (*Client, error) { client := &Client{ serverPicker: protocol.NewRoundRobinServerPicker(serverList), } + space := app.SpaceFromContext(ctx) + if space == nil { + return nil, newError("Space not found.") + } + space.OnInitialize(func() error { + pm := policy.PolicyFromSpace(space) + if pm == nil { + return newError("Policy not found in space.") + } + client.policyManager = pm + return nil + }) return client, nil } @@ -90,8 +104,9 @@ func (v *Client) Process(ctx context.Context, outboundRay ray.OutboundRay, diale request.Option |= RequestOptionOneTimeAuth } + sessionPolicy := v.policyManager.GetPolicy(user.Level) ctx, cancel := context.WithCancel(ctx) - timer := signal.CancelAfterInactivity(ctx, cancel, time.Minute*5) + timer := signal.CancelAfterInactivity(ctx, cancel, sessionPolicy.Timeout.ConnectionIdle.Duration()) if request.Command == protocol.RequestCommandTCP { bufferedWriter := buf.NewBufferedWriter(buf.NewWriter(conn)) @@ -105,11 +120,13 @@ func (v *Client) Process(ctx context.Context, outboundRay ray.OutboundRay, diale } requestDone := signal.ExecuteAsync(func() error { + defer timer.SetTimeout(sessionPolicy.Timeout.DownlinkOnly.Duration()) return buf.Copy(outboundRay.OutboundInput(), bodyWriter, buf.UpdateActivity(timer)) }) responseDone := signal.ExecuteAsync(func() error { defer outboundRay.OutboundOutput().Close() + defer timer.SetTimeout(sessionPolicy.Timeout.UplinkOnly.Duration()) responseReader, err := ReadTCPResponse(user, conn) if err != nil { diff --git a/proxy/shadowsocks/config.proto b/proxy/shadowsocks/config.proto index fbc2c912..4323ef04 100644 --- a/proxy/shadowsocks/config.proto +++ b/proxy/shadowsocks/config.proto @@ -38,4 +38,4 @@ message ServerConfig { message ClientConfig { repeated v2ray.core.common.protocol.ServerEndpoint server = 1; -} \ No newline at end of file +} diff --git a/proxy/shadowsocks/server.go b/proxy/shadowsocks/server.go index 9feeb337..f2d40944 100644 --- a/proxy/shadowsocks/server.go +++ b/proxy/shadowsocks/server.go @@ -7,6 +7,7 @@ import ( "v2ray.com/core/app" "v2ray.com/core/app/dispatcher" "v2ray.com/core/app/log" + "v2ray.com/core/app/policy" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" @@ -18,9 +19,10 @@ import ( ) type Server struct { - config *ServerConfig - user *protocol.User - account *ShadowsocksAccount + config *ServerConfig + user *protocol.User + account *ShadowsocksAccount + policyManager policy.Interface } // NewServer create a new Shadowsocks server. @@ -45,6 +47,15 @@ func NewServer(ctx context.Context, config *ServerConfig) (*Server, error) { account: account, } + space.OnInitialize(func() error { + pm := policy.PolicyFromSpace(space) + if pm == nil { + return newError("Policy not found in space.") + } + s.policyManager = pm + return nil + }) + return s, nil } @@ -128,7 +139,8 @@ func (s *Server) handlerUDPPayload(ctx context.Context, conn internet.Connection } func (s *Server) handleConnection(ctx context.Context, conn internet.Connection, dispatcher dispatcher.Interface) error { - conn.SetReadDeadline(time.Now().Add(time.Second * 8)) + sessionPolicy := s.policyManager.GetPolicy(s.user.Level) + conn.SetReadDeadline(time.Now().Add(sessionPolicy.Timeout.Handshake.Duration())) bufferedReader := buf.NewBufferedReader(buf.NewReader(conn)) request, bodyReader, err := ReadTCPSession(s.user, bufferedReader) if err != nil { @@ -145,9 +157,8 @@ func (s *Server) handleConnection(ctx context.Context, conn internet.Connection, ctx = protocol.ContextWithUser(ctx, request.User) - userSettings := s.user.GetSettings() ctx, cancel := context.WithCancel(ctx) - timer := signal.CancelAfterInactivity(ctx, cancel, userSettings.PayloadTimeout) + timer := signal.CancelAfterInactivity(ctx, cancel, sessionPolicy.Timeout.ConnectionIdle.Duration()) ray, err := dispatcher.Dispatch(ctx, dest) if err != nil { return err @@ -177,7 +188,7 @@ func (s *Server) handleConnection(ctx context.Context, conn internet.Connection, return newError("failed to transport all TCP response").Base(err) } - timer.SetTimeout(time.Second * 2) + timer.SetTimeout(sessionPolicy.Timeout.UplinkOnly.Duration()) return nil }) @@ -188,6 +199,7 @@ func (s *Server) handleConnection(ctx context.Context, conn internet.Connection, if err := buf.Copy(bodyReader, ray.InboundInput(), buf.UpdateActivity(timer)); err != nil { return newError("failed to transport all TCP request").Base(err) } + timer.SetTimeout(sessionPolicy.Timeout.DownlinkOnly.Duration()) return nil }) diff --git a/proxy/socks/config.pb.go b/proxy/socks/config.pb.go index 74942bdc..3b664de9 100644 --- a/proxy/socks/config.pb.go +++ b/proxy/socks/config.pb.go @@ -68,6 +68,7 @@ type ServerConfig struct { Address *v2ray_core_common_net.IPOrDomain `protobuf:"bytes,3,opt,name=address" json:"address,omitempty"` UdpEnabled bool `protobuf:"varint,4,opt,name=udp_enabled,json=udpEnabled" json:"udp_enabled,omitempty"` Timeout uint32 `protobuf:"varint,5,opt,name=timeout" json:"timeout,omitempty"` + UserLevel uint32 `protobuf:"varint,6,opt,name=user_level,json=userLevel" json:"user_level,omitempty"` } func (m *ServerConfig) Reset() { *m = ServerConfig{} } @@ -110,6 +111,13 @@ func (m *ServerConfig) GetTimeout() uint32 { return 0 } +func (m *ServerConfig) GetUserLevel() uint32 { + if m != nil { + return m.UserLevel + } + return 0 +} + type ClientConfig struct { Server []*v2ray_core_common_protocol1.ServerEndpoint `protobuf:"bytes,1,rep,name=server" json:"server,omitempty"` } @@ -136,34 +144,35 @@ func init() { func init() { proto.RegisterFile("v2ray.com/core/proxy/socks/config.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 449 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x91, 0xd1, 0x6e, 0xd3, 0x3e, - 0x14, 0xc6, 0xff, 0x49, 0xff, 0x5d, 0xb3, 0xd3, 0x0e, 0x55, 0x16, 0x9a, 0xa2, 0xdc, 0x10, 0x2a, - 0x21, 0xa2, 0x5d, 0x38, 0x28, 0xdc, 0x20, 0x26, 0x90, 0xb2, 0xae, 0x12, 0xdc, 0xac, 0x95, 0x3b, - 0x40, 0xe2, 0xa6, 0xf2, 0x1c, 0xc3, 0xa2, 0x35, 0x76, 0x64, 0x3b, 0x85, 0xbc, 0x12, 0x8f, 0xc3, - 0x13, 0xa1, 0xda, 0xc9, 0x34, 0x50, 0x77, 0x77, 0x4e, 0xce, 0x77, 0xbe, 0x9c, 0xef, 0x67, 0x78, - 0xb9, 0xcb, 0x14, 0x6d, 0x31, 0x93, 0x55, 0xca, 0xa4, 0xe2, 0x69, 0xad, 0xe4, 0xcf, 0x36, 0xd5, - 0x92, 0xdd, 0xe9, 0x94, 0x49, 0xf1, 0xad, 0xfc, 0x8e, 0x6b, 0x25, 0x8d, 0x44, 0xa7, 0xbd, 0x50, - 0x71, 0x6c, 0x45, 0xd8, 0x8a, 0xa2, 0x7f, 0x0d, 0x98, 0xac, 0x2a, 0x29, 0x52, 0xc1, 0x4d, 0x4a, - 0x8b, 0x42, 0x71, 0xad, 0x9d, 0x41, 0xf4, 0xea, 0xb0, 0xd0, 0x0e, 0x99, 0xdc, 0xa6, 0x9a, 0xab, - 0x1d, 0x57, 0x1b, 0x5d, 0x73, 0xe6, 0x36, 0x66, 0x39, 0x8c, 0x72, 0xc6, 0x64, 0x23, 0x0c, 0x8a, - 0x20, 0x68, 0x34, 0x57, 0x82, 0x56, 0x3c, 0xf4, 0x62, 0x2f, 0x39, 0x26, 0xf7, 0xfd, 0x7e, 0x56, - 0x53, 0xad, 0x7f, 0x48, 0x55, 0x84, 0xbe, 0x9b, 0xf5, 0xfd, 0xec, 0xb7, 0x0f, 0x93, 0xb5, 0x35, - 0x9e, 0xdb, 0x30, 0xe8, 0x1d, 0x1c, 0xd3, 0xc6, 0xdc, 0x6e, 0x4c, 0x5b, 0x3b, 0xa7, 0x27, 0x59, - 0x8c, 0x0f, 0x47, 0xc3, 0x79, 0x63, 0x6e, 0xaf, 0xdb, 0x9a, 0x93, 0x80, 0x76, 0x15, 0xba, 0x82, - 0x80, 0xba, 0x93, 0x74, 0xe8, 0xc7, 0x83, 0x64, 0x9c, 0x65, 0x8f, 0x6d, 0x3f, 0xfc, 0x2d, 0xee, - 0x72, 0xe8, 0x85, 0x30, 0xaa, 0x25, 0xf7, 0x1e, 0xe8, 0x1c, 0x46, 0x1d, 0xa5, 0x70, 0x10, 0x7b, - 0xc9, 0x38, 0x7b, 0xfe, 0xd0, 0xce, 0x21, 0xc2, 0x82, 0x1b, 0xfc, 0x71, 0xb5, 0x54, 0x97, 0xb2, - 0xa2, 0xa5, 0x20, 0xfd, 0x06, 0x7a, 0x06, 0xe3, 0xa6, 0xa8, 0x37, 0x5c, 0xd0, 0x9b, 0x2d, 0x2f, - 0xc2, 0xff, 0x63, 0x2f, 0x09, 0x08, 0x34, 0x45, 0xbd, 0x70, 0x5f, 0x50, 0x08, 0x23, 0x53, 0x56, - 0x5c, 0x36, 0x26, 0x1c, 0xc6, 0x5e, 0x72, 0x42, 0xfa, 0x36, 0x3a, 0x87, 0x93, 0xbf, 0x4e, 0x42, - 0x53, 0x18, 0xdc, 0xf1, 0xb6, 0x63, 0xbb, 0x2f, 0xd1, 0x53, 0x18, 0xee, 0xe8, 0xb6, 0xe1, 0x1d, - 0x53, 0xd7, 0xbc, 0xf5, 0xdf, 0x78, 0x33, 0x02, 0x93, 0xf9, 0xb6, 0xe4, 0xc2, 0x74, 0x4c, 0x2f, - 0xe0, 0xc8, 0x3d, 0x5e, 0xe8, 0x59, 0x24, 0x67, 0x07, 0x32, 0xf4, 0xcf, 0xdc, 0x61, 0x59, 0x88, - 0xa2, 0x96, 0xa5, 0x30, 0xa4, 0xdb, 0x3c, 0x7b, 0x01, 0x41, 0x8f, 0x1b, 0x8d, 0x61, 0x74, 0xb5, - 0xdc, 0xe4, 0x9f, 0xae, 0x3f, 0x4c, 0xff, 0x43, 0x13, 0x08, 0x56, 0xf9, 0x7a, 0xfd, 0x65, 0x49, - 0x2e, 0xa7, 0xde, 0xc5, 0x7b, 0x88, 0x98, 0xac, 0x1e, 0x41, 0xbe, 0xf2, 0xbe, 0x0e, 0x6d, 0xf1, - 0xcb, 0x3f, 0xfd, 0x9c, 0x11, 0xda, 0xe2, 0xf9, 0x5e, 0xb1, 0xb2, 0x8a, 0xf5, 0x7e, 0x70, 0x73, - 0x64, 0xef, 0x78, 0xfd, 0x27, 0x00, 0x00, 0xff, 0xff, 0x57, 0x01, 0x54, 0x95, 0xf7, 0x02, 0x00, - 0x00, + // 470 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x52, 0x5d, 0x8b, 0xd3, 0x40, + 0x14, 0x75, 0xb2, 0xb6, 0x4d, 0x6f, 0xbb, 0x52, 0x06, 0x59, 0x42, 0x51, 0x8c, 0x05, 0xb1, 0xec, + 0xc3, 0x44, 0xe2, 0x8b, 0xb8, 0x28, 0xb4, 0xdd, 0x82, 0x82, 0x6c, 0xcb, 0x74, 0x55, 0xf0, 0x25, + 0xcc, 0x4e, 0x46, 0x37, 0x6c, 0x32, 0x13, 0x66, 0x26, 0xd5, 0xfc, 0x25, 0xff, 0x9f, 0xef, 0x92, + 0xaf, 0x65, 0x95, 0xee, 0xdb, 0xfd, 0x38, 0xf7, 0xcc, 0x3d, 0xe7, 0x0e, 0xbc, 0xdc, 0x87, 0x9a, + 0x95, 0x84, 0xab, 0x2c, 0xe0, 0x4a, 0x8b, 0x20, 0xd7, 0xea, 0x57, 0x19, 0x18, 0xc5, 0x6f, 0x4c, + 0xc0, 0x95, 0xfc, 0x9e, 0xfc, 0x20, 0xb9, 0x56, 0x56, 0xe1, 0x93, 0x0e, 0xa8, 0x05, 0xa9, 0x41, + 0xa4, 0x06, 0x4d, 0xff, 0x27, 0xe0, 0x2a, 0xcb, 0x94, 0x0c, 0xa4, 0xb0, 0x01, 0x8b, 0x63, 0x2d, + 0x8c, 0x69, 0x08, 0xa6, 0xaf, 0x0e, 0x03, 0xeb, 0x26, 0x57, 0x69, 0x60, 0x84, 0xde, 0x0b, 0x1d, + 0x99, 0x5c, 0xf0, 0x66, 0x62, 0xb6, 0x80, 0xc1, 0x82, 0x73, 0x55, 0x48, 0x8b, 0xa7, 0xe0, 0x16, + 0x46, 0x68, 0xc9, 0x32, 0xe1, 0x21, 0x1f, 0xcd, 0x87, 0xf4, 0x36, 0xaf, 0x7a, 0x39, 0x33, 0xe6, + 0xa7, 0xd2, 0xb1, 0xe7, 0x34, 0xbd, 0x2e, 0x9f, 0xfd, 0x71, 0x60, 0xbc, 0xab, 0x89, 0x57, 0xb5, + 0x18, 0xfc, 0x0e, 0x86, 0xac, 0xb0, 0xd7, 0x91, 0x2d, 0xf3, 0x86, 0xe9, 0x51, 0xe8, 0x93, 0xc3, + 0xd2, 0xc8, 0xa2, 0xb0, 0xd7, 0x97, 0x65, 0x2e, 0xa8, 0xcb, 0xda, 0x08, 0x5f, 0x80, 0xcb, 0x9a, + 0x95, 0x8c, 0xe7, 0xf8, 0x47, 0xf3, 0x51, 0x18, 0xde, 0x37, 0x7d, 0xf7, 0x59, 0xd2, 0xea, 0x30, + 0x6b, 0x69, 0x75, 0x49, 0x6f, 0x39, 0xf0, 0x19, 0x0c, 0x5a, 0x97, 0xbc, 0x23, 0x1f, 0xcd, 0x47, + 0xe1, 0xf3, 0xbb, 0x74, 0x8d, 0x45, 0x44, 0x0a, 0x4b, 0x3e, 0x6e, 0x37, 0xfa, 0x5c, 0x65, 0x2c, + 0x91, 0xb4, 0x9b, 0xc0, 0xcf, 0x60, 0x54, 0xc4, 0x79, 0x24, 0x24, 0xbb, 0x4a, 0x45, 0xec, 0x3d, + 0xf4, 0xd1, 0xdc, 0xa5, 0x50, 0xc4, 0xf9, 0xba, 0xa9, 0xe0, 0x27, 0x30, 0xb0, 0x49, 0x26, 0x54, + 0x61, 0xbd, 0x9e, 0x8f, 0xe6, 0xc7, 0x4b, 0xc7, 0x43, 0xb4, 0x2b, 0xe1, 0xa7, 0x00, 0x95, 0x87, + 0x51, 0x2a, 0xf6, 0x22, 0xf5, 0xfa, 0x15, 0x80, 0x0e, 0xab, 0xca, 0xa7, 0xaa, 0x30, 0x3d, 0x83, + 0xe3, 0x7f, 0xb6, 0xc6, 0x13, 0x38, 0xba, 0x11, 0x65, 0x6b, 0x7f, 0x15, 0xe2, 0xc7, 0xd0, 0xdb, + 0xb3, 0xb4, 0x10, 0xad, 0xed, 0x4d, 0xf2, 0xd6, 0x79, 0x83, 0x66, 0x14, 0xc6, 0xab, 0x34, 0x11, + 0xd2, 0xb6, 0xb6, 0x2f, 0xa1, 0xdf, 0xdc, 0xd7, 0x43, 0xb5, 0x6b, 0xa7, 0x07, 0x64, 0x76, 0x3f, + 0xa1, 0x75, 0x6e, 0x2d, 0xe3, 0x5c, 0x25, 0xd2, 0xd2, 0x76, 0xf2, 0xf4, 0x05, 0xb8, 0xdd, 0x45, + 0xf0, 0x08, 0x06, 0x17, 0x9b, 0x68, 0xf1, 0xf9, 0xf2, 0xc3, 0xe4, 0x01, 0x1e, 0x83, 0xbb, 0x5d, + 0xec, 0x76, 0x5f, 0x37, 0xf4, 0x7c, 0x82, 0x96, 0xef, 0x61, 0xca, 0x55, 0x76, 0xcf, 0x55, 0xb6, + 0xe8, 0x5b, 0xaf, 0x0e, 0x7e, 0x3b, 0x27, 0x5f, 0x42, 0xca, 0x4a, 0xb2, 0xaa, 0x10, 0xdb, 0x1a, + 0xb1, 0xab, 0x1a, 0x57, 0xfd, 0x7a, 0x8f, 0xd7, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x23, 0xac, + 0x72, 0x71, 0x1a, 0x03, 0x00, 0x00, } diff --git a/proxy/socks/config.proto b/proxy/socks/config.proto index f6121c5e..0d69862b 100644 --- a/proxy/socks/config.proto +++ b/proxy/socks/config.proto @@ -24,9 +24,10 @@ message ServerConfig { map accounts = 2; v2ray.core.common.net.IPOrDomain address = 3; bool udp_enabled = 4; - uint32 timeout = 5; + uint32 timeout = 5 [deprecated = true]; + uint32 user_level = 6; } message ClientConfig { repeated v2ray.core.common.protocol.ServerEndpoint server = 1; -} \ No newline at end of file +} diff --git a/proxy/socks/server.go b/proxy/socks/server.go index 95debeb7..de45358e 100644 --- a/proxy/socks/server.go +++ b/proxy/socks/server.go @@ -8,6 +8,7 @@ import ( "v2ray.com/core/app" "v2ray.com/core/app/dispatcher" "v2ray.com/core/app/log" + "v2ray.com/core/app/policy" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" @@ -21,6 +22,7 @@ import ( // Server is a SOCKS 5 proxy server type Server struct { config *ServerConfig + policy policy.Policy } // NewServer creates a new Server object. @@ -32,6 +34,17 @@ func NewServer(ctx context.Context, config *ServerConfig) (*Server, error) { s := &Server{ config: config, } + space.OnInitialize(func() error { + pm := policy.PolicyFromSpace(space) + if pm == nil { + return newError("Policy not found in space.") + } + s.policy = pm.GetPolicy(config.UserLevel) + if config.Timeout > 0 && config.UserLevel == 0 { + s.policy.Timeout.ConnectionIdle.Value = config.Timeout + } + return nil + }) return s, nil } @@ -57,7 +70,7 @@ func (s *Server) Process(ctx context.Context, network net.Network, conn internet } func (s *Server) processTCP(ctx context.Context, conn internet.Connection, dispatcher dispatcher.Interface) error { - conn.SetReadDeadline(time.Now().Add(time.Second * 8)) + conn.SetReadDeadline(time.Now().Add(s.policy.Timeout.Handshake.Duration())) reader := buf.NewBufferedReader(buf.NewReader(conn)) inboundDest, ok := proxy.InboundEntryPointFromContext(ctx) @@ -103,12 +116,8 @@ func (*Server) handleUDP(c net.Conn) error { } func (v *Server) transport(ctx context.Context, reader io.Reader, writer io.Writer, dest net.Destination, dispatcher dispatcher.Interface) error { - timeout := time.Second * time.Duration(v.config.Timeout) - if timeout == 0 { - timeout = time.Minute * 5 - } ctx, cancel := context.WithCancel(ctx) - timer := signal.CancelAfterInactivity(ctx, cancel, timeout) + timer := signal.CancelAfterInactivity(ctx, cancel, v.policy.Timeout.ConnectionIdle.Duration()) ray, err := dispatcher.Dispatch(ctx, dest) if err != nil { @@ -125,6 +134,7 @@ func (v *Server) transport(ctx context.Context, reader io.Reader, writer io.Writ if err := buf.Copy(v2reader, input, buf.UpdateActivity(timer)); err != nil { return newError("failed to transport all TCP request").Base(err) } + timer.SetTimeout(v.policy.Timeout.DownlinkOnly.Duration()) return nil }) @@ -133,7 +143,7 @@ func (v *Server) transport(ctx context.Context, reader io.Reader, writer io.Writ if err := buf.Copy(output, v2writer, buf.UpdateActivity(timer)); err != nil { return newError("failed to transport all TCP response").Base(err) } - timer.SetTimeout(time.Second * 2) + timer.SetTimeout(v.policy.Timeout.UplinkOnly.Duration()) return nil }) diff --git a/proxy/vmess/inbound/inbound.go b/proxy/vmess/inbound/inbound.go index 847ce549..731ba440 100644 --- a/proxy/vmess/inbound/inbound.go +++ b/proxy/vmess/inbound/inbound.go @@ -11,6 +11,7 @@ import ( "v2ray.com/core/app" "v2ray.com/core/app/dispatcher" "v2ray.com/core/app/log" + "v2ray.com/core/app/policy" "v2ray.com/core/app/proxyman" "v2ray.com/core/common" "v2ray.com/core/common/buf" @@ -78,6 +79,7 @@ type Handler struct { usersByEmail *userByEmail detours *DetourConfig sessionHistory *encoding.SessionHistory + policyManager policy.Interface } // New creates a new VMess inbound handler. @@ -104,7 +106,11 @@ func New(ctx context.Context, config *Config) (*Handler, error) { space.OnInitialize(func() error { handler.inboundHandlerManager = proxyman.InboundHandlerManagerFromSpace(space) if handler.inboundHandlerManager == nil { - return newError("InboundHandlerManager is not found is space") + return newError("InboundHandlerManager is not found is space.") + } + handler.policyManager = policy.PolicyFromSpace(space) + if handler.policyManager == nil { + return newError("Policy is not found in space.") } return nil }) @@ -174,7 +180,8 @@ func transferResponse(timer signal.ActivityUpdater, session *encoding.ServerSess // Process implements proxy.Inbound.Process(). func (h *Handler) Process(ctx context.Context, network net.Network, connection internet.Connection, dispatcher dispatcher.Interface) error { - if err := connection.SetReadDeadline(time.Now().Add(time.Second * 8)); err != nil { + sessionPolicy := h.policyManager.GetPolicy(0) + if err := connection.SetReadDeadline(time.Now().Add(sessionPolicy.Timeout.Handshake.Duration())); err != nil { return newError("unable to set read deadline").Base(err).AtWarning() } @@ -203,11 +210,11 @@ func (h *Handler) Process(ctx context.Context, network net.Network, connection i log.Trace(newError("unable to set back read deadline").Base(err)) } - userSettings := request.User.GetSettings() + sessionPolicy = h.policyManager.GetPolicy(request.User.Level) ctx = protocol.ContextWithUser(ctx, request.User) ctx, cancel := context.WithCancel(ctx) - timer := signal.CancelAfterInactivity(ctx, cancel, userSettings.PayloadTimeout) + timer := signal.CancelAfterInactivity(ctx, cancel, sessionPolicy.Timeout.ConnectionIdle.Duration()) ray, err := dispatcher.Dispatch(ctx, request.Destination()) if err != nil { return newError("failed to dispatch request to ", request.Destination()).Base(err) @@ -217,12 +224,14 @@ func (h *Handler) Process(ctx context.Context, network net.Network, connection i output := ray.InboundOutput() requestDone := signal.ExecuteAsync(func() error { + defer timer.SetTimeout(sessionPolicy.Timeout.DownlinkOnly.Duration()) return transferRequest(timer, session, request, reader, input) }) responseDone := signal.ExecuteAsync(func() error { writer := buf.NewBufferedWriter(buf.NewWriter(connection)) defer writer.Flush() + defer timer.SetTimeout(sessionPolicy.Timeout.UplinkOnly.Duration()) response := &protocol.ResponseHeader{ Command: h.generateCommand(ctx, request), diff --git a/proxy/vmess/outbound/outbound.go b/proxy/vmess/outbound/outbound.go index c2d7fb7e..a1a0287b 100644 --- a/proxy/vmess/outbound/outbound.go +++ b/proxy/vmess/outbound/outbound.go @@ -8,6 +8,7 @@ import ( "v2ray.com/core/app" "v2ray.com/core/app/log" + "v2ray.com/core/app/policy" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" @@ -23,8 +24,9 @@ import ( // Handler is an outbound connection handler for VMess protocol. type Handler struct { - serverList *protocol.ServerList - serverPicker protocol.ServerPicker + serverList *protocol.ServerList + serverPicker protocol.ServerPicker + policyManager policy.Interface } func New(ctx context.Context, config *Config) (*Handler, error) { @@ -42,6 +44,15 @@ func New(ctx context.Context, config *Config) (*Handler, error) { serverPicker: protocol.NewRoundRobinServerPicker(serverList), } + space.OnInitialize(func() error { + pm := policy.PolicyFromSpace(space) + if pm == nil { + return newError("Policy is not found in space.") + } + handler.policyManager = pm + return nil + }) + return handler, nil } @@ -102,9 +113,10 @@ func (v *Handler) Process(ctx context.Context, outboundRay ray.OutboundRay, dial output := outboundRay.OutboundOutput() session := encoding.NewClientSession(protocol.DefaultIDHash) + sessionPolicy := v.policyManager.GetPolicy(request.User.Level) ctx, cancel := context.WithCancel(ctx) - timer := signal.CancelAfterInactivity(ctx, cancel, time.Minute*5) + timer := signal.CancelAfterInactivity(ctx, cancel, sessionPolicy.Timeout.ConnectionIdle.Duration()) requestDone := signal.ExecuteAsync(func() error { writer := buf.NewBufferedWriter(buf.NewWriter(conn)) @@ -137,11 +149,13 @@ func (v *Handler) Process(ctx context.Context, outboundRay ray.OutboundRay, dial return err } } + timer.SetTimeout(sessionPolicy.Timeout.DownlinkOnly.Duration()) return nil }) responseDone := signal.ExecuteAsync(func() error { defer output.Close() + defer timer.SetTimeout(sessionPolicy.Timeout.UplinkOnly.Duration()) reader := buf.NewBufferedReader(buf.NewReader(conn)) header, err := session.DecodeResponseHeader(reader) diff --git a/v2ray.go b/v2ray.go index 06baa2e5..1107e3b8 100644 --- a/v2ray.go +++ b/v2ray.go @@ -7,6 +7,7 @@ import ( "v2ray.com/core/app/dispatcher" "v2ray.com/core/app/dns" "v2ray.com/core/app/log" + "v2ray.com/core/app/policy" "v2ray.com/core/app/proxyman" "v2ray.com/core/common" "v2ray.com/core/common/net" @@ -115,7 +116,24 @@ func newSimpleServer(config *Config) (*simpleServer, error) { return nil, err } common.Must(space.AddApplication(d)) - // disp = d.(dispatcher.Interface) + } + + if p := policy.PolicyFromSpace(space); p == nil { + p, err := app.CreateAppFromConfig(ctx, &policy.Config{ + Level: map[uint32]*policy.Policy{ + 1: &policy.Policy{ + Timeout: &policy.Policy_Timeout{ + ConnectionIdle: &policy.Second{ + Value: 600, + }, + }, + }, + }, + }) + if err != nil { + return nil, err + } + common.Must(space.AddApplication(p)) } for _, inbound := range config.Inbound { From f90ec9fff05019eaa4e88647679858c3ebea3872 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Mon, 27 Nov 2017 22:18:39 +0100 Subject: [PATCH 211/229] rename interfaces --- app/policy/manager/manager.go | 2 +- app/policy/policy.go | 11 +++++++---- proxy/dokodemo/dokodemo.go | 2 +- proxy/freedom/freedom.go | 2 +- proxy/http/server.go | 2 +- proxy/shadowsocks/client.go | 4 ++-- proxy/shadowsocks/server.go | 4 ++-- proxy/socks/server.go | 2 +- proxy/vmess/inbound/inbound.go | 4 ++-- proxy/vmess/outbound/outbound.go | 4 ++-- v2ray.go | 2 +- 11 files changed, 21 insertions(+), 18 deletions(-) diff --git a/app/policy/manager/manager.go b/app/policy/manager/manager.go index 73ec14f8..8f53be70 100644 --- a/app/policy/manager/manager.go +++ b/app/policy/manager/manager.go @@ -52,7 +52,7 @@ func (m *Instance) Close() { } func (m *Instance) Interface() interface{} { - return (*policy.Interface)(nil) + return (*policy.Manager)(nil) } func init() { diff --git a/app/policy/policy.go b/app/policy/policy.go index 1849a5ff..f67e736e 100644 --- a/app/policy/policy.go +++ b/app/policy/policy.go @@ -4,14 +4,17 @@ import ( "v2ray.com/core/app" ) -type Interface interface { +// Manager is an utility to manage policy per user level. +type Manager interface { + // GetPolicy returns the Policy for the given user level. GetPolicy(level uint32) Policy } -func PolicyFromSpace(space app.Space) Interface { - app := space.GetApplication((*Interface)(nil)) +// FromSpace returns the policy.Manager in a space. +func FromSpace(space app.Space) Manager { + app := space.GetApplication((*Manager)(nil)) if app == nil { return nil } - return app.(Interface) + return app.(Manager) } diff --git a/proxy/dokodemo/dokodemo.go b/proxy/dokodemo/dokodemo.go index 06410569..6dc44291 100644 --- a/proxy/dokodemo/dokodemo.go +++ b/proxy/dokodemo/dokodemo.go @@ -39,7 +39,7 @@ func New(ctx context.Context, config *Config) (*DokodemoDoor, error) { port: net.Port(config.Port), } space.OnInitialize(func() error { - pm := policy.PolicyFromSpace(space) + pm := policy.FromSpace(space) if pm == nil { return newError("Policy not found in space.") } diff --git a/proxy/freedom/freedom.go b/proxy/freedom/freedom.go index d38bb618..d44df140 100644 --- a/proxy/freedom/freedom.go +++ b/proxy/freedom/freedom.go @@ -47,7 +47,7 @@ func New(ctx context.Context, config *Config) (*Handler, error) { return newError("DNS server is not found in the space") } } - pm := policy.PolicyFromSpace(space) + pm := policy.FromSpace(space) if pm == nil { return newError("Policy not found in space.") } diff --git a/proxy/http/server.go b/proxy/http/server.go index e7e0b65e..1dcc9423 100644 --- a/proxy/http/server.go +++ b/proxy/http/server.go @@ -38,7 +38,7 @@ func NewServer(ctx context.Context, config *ServerConfig) (*Server, error) { config: config, } space.OnInitialize(func() error { - pm := policy.PolicyFromSpace(space) + pm := policy.FromSpace(space) if pm == nil { return newError("Policy not found in space.") } diff --git a/proxy/shadowsocks/client.go b/proxy/shadowsocks/client.go index 473ecf62..6f67c91a 100644 --- a/proxy/shadowsocks/client.go +++ b/proxy/shadowsocks/client.go @@ -20,7 +20,7 @@ import ( // Client is a inbound handler for Shadowsocks protocol type Client struct { serverPicker protocol.ServerPicker - policyManager policy.Interface + policyManager policy.Manager } // NewClient create a new Shadowsocks client. @@ -40,7 +40,7 @@ func NewClient(ctx context.Context, config *ClientConfig) (*Client, error) { return nil, newError("Space not found.") } space.OnInitialize(func() error { - pm := policy.PolicyFromSpace(space) + pm := policy.FromSpace(space) if pm == nil { return newError("Policy not found in space.") } diff --git a/proxy/shadowsocks/server.go b/proxy/shadowsocks/server.go index f2d40944..b0a05ccf 100644 --- a/proxy/shadowsocks/server.go +++ b/proxy/shadowsocks/server.go @@ -22,7 +22,7 @@ type Server struct { config *ServerConfig user *protocol.User account *ShadowsocksAccount - policyManager policy.Interface + policyManager policy.Manager } // NewServer create a new Shadowsocks server. @@ -48,7 +48,7 @@ func NewServer(ctx context.Context, config *ServerConfig) (*Server, error) { } space.OnInitialize(func() error { - pm := policy.PolicyFromSpace(space) + pm := policy.FromSpace(space) if pm == nil { return newError("Policy not found in space.") } diff --git a/proxy/socks/server.go b/proxy/socks/server.go index de45358e..47373961 100644 --- a/proxy/socks/server.go +++ b/proxy/socks/server.go @@ -35,7 +35,7 @@ func NewServer(ctx context.Context, config *ServerConfig) (*Server, error) { config: config, } space.OnInitialize(func() error { - pm := policy.PolicyFromSpace(space) + pm := policy.FromSpace(space) if pm == nil { return newError("Policy not found in space.") } diff --git a/proxy/vmess/inbound/inbound.go b/proxy/vmess/inbound/inbound.go index 731ba440..4c10f959 100644 --- a/proxy/vmess/inbound/inbound.go +++ b/proxy/vmess/inbound/inbound.go @@ -79,7 +79,7 @@ type Handler struct { usersByEmail *userByEmail detours *DetourConfig sessionHistory *encoding.SessionHistory - policyManager policy.Interface + policyManager policy.Manager } // New creates a new VMess inbound handler. @@ -108,7 +108,7 @@ func New(ctx context.Context, config *Config) (*Handler, error) { if handler.inboundHandlerManager == nil { return newError("InboundHandlerManager is not found is space.") } - handler.policyManager = policy.PolicyFromSpace(space) + handler.policyManager = policy.FromSpace(space) if handler.policyManager == nil { return newError("Policy is not found in space.") } diff --git a/proxy/vmess/outbound/outbound.go b/proxy/vmess/outbound/outbound.go index a1a0287b..1547cc47 100644 --- a/proxy/vmess/outbound/outbound.go +++ b/proxy/vmess/outbound/outbound.go @@ -26,7 +26,7 @@ import ( type Handler struct { serverList *protocol.ServerList serverPicker protocol.ServerPicker - policyManager policy.Interface + policyManager policy.Manager } func New(ctx context.Context, config *Config) (*Handler, error) { @@ -45,7 +45,7 @@ func New(ctx context.Context, config *Config) (*Handler, error) { } space.OnInitialize(func() error { - pm := policy.PolicyFromSpace(space) + pm := policy.FromSpace(space) if pm == nil { return newError("Policy is not found in space.") } diff --git a/v2ray.go b/v2ray.go index 1107e3b8..687ca8ed 100644 --- a/v2ray.go +++ b/v2ray.go @@ -118,7 +118,7 @@ func newSimpleServer(config *Config) (*simpleServer, error) { common.Must(space.AddApplication(d)) } - if p := policy.PolicyFromSpace(space); p == nil { + if p := policy.FromSpace(space); p == nil { p, err := app.CreateAppFromConfig(ctx, &policy.Config{ Level: map[uint32]*policy.Policy{ 1: &policy.Policy{ From 5f912570188d8549fce025ea003bd109bf9b2923 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Mon, 27 Nov 2017 23:00:36 +0100 Subject: [PATCH 212/229] fix error message --- main/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main/main.go b/main/main.go index 9b4cfcc4..84bc1bf9 100644 --- a/main/main.go +++ b/main/main.go @@ -68,7 +68,7 @@ func startV2Ray() (core.Server, error) { server, err := core.New(config) if err != nil { - return nil, newError("failed to create initialize").Base(err) + return nil, newError("failed to create server").Base(err) } return server, nil From 973ce07db971f49a91dc3543b9ca2cd47daa24c0 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Mon, 27 Nov 2017 23:25:43 +0100 Subject: [PATCH 213/229] fix proto merging logic --- app/policy/config.go | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/app/policy/config.go b/app/policy/config.go index 073ce9f2..2e07c53b 100644 --- a/app/policy/config.go +++ b/app/policy/config.go @@ -2,8 +2,6 @@ package policy import ( "time" - - "github.com/golang/protobuf/proto" ) func (s *Second) Duration() time.Duration { @@ -11,5 +9,18 @@ func (s *Second) Duration() time.Duration { } func (p *Policy) OverrideWith(another *Policy) { - proto.Merge(p, another) + if another.Timeout != nil { + if another.Timeout.Handshake != nil { + p.Timeout.Handshake = another.Timeout.Handshake + } + if another.Timeout.ConnectionIdle != nil { + p.Timeout.ConnectionIdle = another.Timeout.ConnectionIdle + } + if another.Timeout.UplinkOnly != nil { + p.Timeout.UplinkOnly = another.Timeout.UplinkOnly + } + if another.Timeout.DownlinkOnly != nil { + p.Timeout.DownlinkOnly = another.Timeout.DownlinkOnly + } + } } From fd8db49dc97e08ef6a785b18b696bb3696f4ca8a Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Tue, 28 Nov 2017 23:41:20 +0100 Subject: [PATCH 214/229] generalized event handler --- app/dispatcher/impl/default.go | 2 +- app/dns/server/server.go | 2 +- app/policy/manager/manager.go | 4 +++ app/proxyman/mux/mux.go | 2 +- app/proxyman/outbound/handler.go | 2 +- app/router/router.go | 2 +- app/space.go | 36 ++++++++++++------------- common/event/event.go | 46 ++++++++++++++++++++++++++++++++ proxy/dokodemo/dokodemo.go | 2 +- proxy/freedom/freedom.go | 2 +- proxy/http/server.go | 2 +- proxy/shadowsocks/client.go | 2 +- proxy/shadowsocks/server.go | 2 +- proxy/socks/server.go | 2 +- proxy/vmess/inbound/inbound.go | 2 +- proxy/vmess/outbound/outbound.go | 2 +- 16 files changed, 80 insertions(+), 32 deletions(-) create mode 100644 common/event/event.go diff --git a/app/dispatcher/impl/default.go b/app/dispatcher/impl/default.go index 89bc5570..e9e5c080 100644 --- a/app/dispatcher/impl/default.go +++ b/app/dispatcher/impl/default.go @@ -39,7 +39,7 @@ func NewDefaultDispatcher(ctx context.Context, config *dispatcher.Config) (*Defa return nil, newError("no space in context") } d := &DefaultDispatcher{} - space.OnInitialize(func() error { + space.On(app.SpaceInitializing, func(interface{}) error { d.ohm = proxyman.OutboundHandlerManagerFromSpace(space) if d.ohm == nil { return newError("OutboundHandlerManager is not found in the space") diff --git a/app/dns/server/server.go b/app/dns/server/server.go index fd6987cb..904feec7 100644 --- a/app/dns/server/server.go +++ b/app/dns/server/server.go @@ -52,7 +52,7 @@ func NewCacheServer(ctx context.Context, config *dns.Config) (*CacheServer, erro servers: make([]NameServer, len(config.NameServers)), hosts: config.GetInternalHosts(), } - space.OnInitialize(func() error { + space.On(app.SpaceInitializing, func(interface{}) error { disp := dispatcher.FromSpace(space) if disp == nil { return newError("dispatcher is not found in the space") diff --git a/app/policy/manager/manager.go b/app/policy/manager/manager.go index 8f53be70..6a339d9a 100644 --- a/app/policy/manager/manager.go +++ b/app/policy/manager/manager.go @@ -37,6 +37,7 @@ func global() policy.Policy { } } +// GetPolicy implements policy.Manager. func (m *Instance) GetPolicy(level uint32) policy.Policy { if p, ok := m.levels[level]; ok { return *p @@ -44,13 +45,16 @@ func (m *Instance) GetPolicy(level uint32) policy.Policy { return global() } +// Start implements app.Application.Start(). func (m *Instance) Start() error { return nil } +// Close implements app.Application.Close(). func (m *Instance) Close() { } +// Interface implement app.Application.Interface(). func (m *Instance) Interface() interface{} { return (*policy.Manager)(nil) } diff --git a/app/proxyman/mux/mux.go b/app/proxyman/mux/mux.go index fb44919a..4acbb256 100644 --- a/app/proxyman/mux/mux.go +++ b/app/proxyman/mux/mux.go @@ -274,7 +274,7 @@ type Server struct { func NewServer(ctx context.Context) *Server { s := &Server{} space := app.SpaceFromContext(ctx) - space.OnInitialize(func() error { + space.On(app.SpaceInitializing, func(interface{}) error { d := dispatcher.FromSpace(space) if d == nil { return newError("no dispatcher in space") diff --git a/app/proxyman/outbound/handler.go b/app/proxyman/outbound/handler.go index 03027bdb..422f23fb 100644 --- a/app/proxyman/outbound/handler.go +++ b/app/proxyman/outbound/handler.go @@ -33,7 +33,7 @@ func NewHandler(ctx context.Context, config *proxyman.OutboundHandlerConfig) (*H if space == nil { return nil, newError("no space in context") } - space.OnInitialize(func() error { + space.On(app.SpaceInitializing, func(interface{}) error { ohm := proxyman.OutboundHandlerManagerFromSpace(space) if ohm == nil { return newError("no OutboundManager in space") diff --git a/app/router/router.go b/app/router/router.go index eac5abba..33d6aa91 100644 --- a/app/router/router.go +++ b/app/router/router.go @@ -33,7 +33,7 @@ func NewRouter(ctx context.Context, config *Config) (*Router, error) { rules: make([]Rule, len(config.Rule)), } - space.OnInitialize(func() error { + space.On(app.SpaceInitializing, func(interface{}) error { for idx, rule := range config.Rule { r.rules[idx].Tag = rule.Tag cond, err := rule.BuildCondition() diff --git a/app/space.go b/app/space.go index 09629b69..c307559b 100644 --- a/app/space.go +++ b/app/space.go @@ -5,6 +5,7 @@ import ( "reflect" "v2ray.com/core/common" + "v2ray.com/core/common/event" ) type Application interface { @@ -13,8 +14,6 @@ type Application interface { Close() } -type InitializationCallback func() error - func CreateAppFromConfig(ctx context.Context, config interface{}) (Application, error) { application, err := common.CreateObject(ctx, config) if err != nil { @@ -29,46 +28,45 @@ func CreateAppFromConfig(ctx context.Context, config interface{}) (Application, } // A Space contains all apps that may be available in a V2Ray runtime. -// Caller must check the availability of an app by calling HasXXX before getting its instance. type Space interface { + event.Registry GetApplication(appInterface interface{}) Application AddApplication(application Application) error Initialize() error - OnInitialize(InitializationCallback) Start() error Close() } +const ( + SpaceInitializing event.Event = iota +) + type spaceImpl struct { - initialized bool + event.Listener cache map[reflect.Type]Application - appInit []InitializationCallback + initialized bool } func NewSpace() Space { return &spaceImpl{ - cache: make(map[reflect.Type]Application), - appInit: make([]InitializationCallback, 0, 32), + cache: make(map[reflect.Type]Application), } } -func (s *spaceImpl) OnInitialize(f InitializationCallback) { - if s.initialized { - f() - } else { - s.appInit = append(s.appInit, f) +func (s *spaceImpl) On(e event.Event, h event.Handler) { + if e == SpaceInitializing && s.initialized { + _ = h(nil) // Ignore error + return } + s.Listener.On(e, h) } func (s *spaceImpl) Initialize() error { - for _, f := range s.appInit { - if err := f(); err != nil { - return err - } + if s.initialized { + return nil } - s.appInit = nil s.initialized = true - return nil + return s.Fire(SpaceInitializing, nil) } func (s *spaceImpl) GetApplication(appInterface interface{}) Application { diff --git a/common/event/event.go b/common/event/event.go new file mode 100644 index 00000000..36a58db5 --- /dev/null +++ b/common/event/event.go @@ -0,0 +1,46 @@ +package event + +import "sync" + +type Event uint16 + +type Handler func(data interface{}) error + +type Registry interface { + On(Event, Handler) +} + +type Listener struct { + sync.RWMutex + events map[Event][]Handler +} + +func (l *Listener) On(e Event, h Handler) { + l.Lock() + defer l.Unlock() + + if l.events == nil { + l.events = make(map[Event][]Handler) + } + + handlers := l.events[e] + handlers = append(handlers, h) + l.events[e] = handlers +} + +func (l *Listener) Fire(e Event, data interface{}) error { + l.RLock() + defer l.RUnlock() + + if l.events == nil { + return nil + } + + for _, h := range l.events[e] { + if err := h(data); err != nil { + return err + } + } + + return nil +} diff --git a/proxy/dokodemo/dokodemo.go b/proxy/dokodemo/dokodemo.go index 6dc44291..8c1c0083 100644 --- a/proxy/dokodemo/dokodemo.go +++ b/proxy/dokodemo/dokodemo.go @@ -38,7 +38,7 @@ func New(ctx context.Context, config *Config) (*DokodemoDoor, error) { address: config.GetPredefinedAddress(), port: net.Port(config.Port), } - space.OnInitialize(func() error { + space.On(app.SpaceInitializing, func(interface{}) error { pm := policy.FromSpace(space) if pm == nil { return newError("Policy not found in space.") diff --git a/proxy/freedom/freedom.go b/proxy/freedom/freedom.go index d44df140..0fbe4f40 100644 --- a/proxy/freedom/freedom.go +++ b/proxy/freedom/freedom.go @@ -40,7 +40,7 @@ func New(ctx context.Context, config *Config) (*Handler, error) { timeout: config.Timeout, destOverride: config.DestinationOverride, } - space.OnInitialize(func() error { + space.On(app.SpaceInitializing, func(interface{}) error { if config.DomainStrategy == Config_USE_IP { f.dns = dns.FromSpace(space) if f.dns == nil { diff --git a/proxy/http/server.go b/proxy/http/server.go index 1dcc9423..e1f371b6 100644 --- a/proxy/http/server.go +++ b/proxy/http/server.go @@ -37,7 +37,7 @@ func NewServer(ctx context.Context, config *ServerConfig) (*Server, error) { s := &Server{ config: config, } - space.OnInitialize(func() error { + space.On(app.SpaceInitializing, func(interface{}) error { pm := policy.FromSpace(space) if pm == nil { return newError("Policy not found in space.") diff --git a/proxy/shadowsocks/client.go b/proxy/shadowsocks/client.go index 6f67c91a..231834e9 100644 --- a/proxy/shadowsocks/client.go +++ b/proxy/shadowsocks/client.go @@ -39,7 +39,7 @@ func NewClient(ctx context.Context, config *ClientConfig) (*Client, error) { if space == nil { return nil, newError("Space not found.") } - space.OnInitialize(func() error { + space.On(app.SpaceInitializing, func(interface{}) error { pm := policy.FromSpace(space) if pm == nil { return newError("Policy not found in space.") diff --git a/proxy/shadowsocks/server.go b/proxy/shadowsocks/server.go index b0a05ccf..023840d3 100644 --- a/proxy/shadowsocks/server.go +++ b/proxy/shadowsocks/server.go @@ -47,7 +47,7 @@ func NewServer(ctx context.Context, config *ServerConfig) (*Server, error) { account: account, } - space.OnInitialize(func() error { + space.On(app.SpaceInitializing, func(interface{}) error { pm := policy.FromSpace(space) if pm == nil { return newError("Policy not found in space.") diff --git a/proxy/socks/server.go b/proxy/socks/server.go index 47373961..8dca1124 100644 --- a/proxy/socks/server.go +++ b/proxy/socks/server.go @@ -34,7 +34,7 @@ func NewServer(ctx context.Context, config *ServerConfig) (*Server, error) { s := &Server{ config: config, } - space.OnInitialize(func() error { + space.On(app.SpaceInitializing, func(interface{}) error { pm := policy.FromSpace(space) if pm == nil { return newError("Policy not found in space.") diff --git a/proxy/vmess/inbound/inbound.go b/proxy/vmess/inbound/inbound.go index 4c10f959..9becd249 100644 --- a/proxy/vmess/inbound/inbound.go +++ b/proxy/vmess/inbound/inbound.go @@ -103,7 +103,7 @@ func New(ctx context.Context, config *Config) (*Handler, error) { sessionHistory: encoding.NewSessionHistory(ctx), } - space.OnInitialize(func() error { + space.On(app.SpaceInitializing, func(interface{}) error { handler.inboundHandlerManager = proxyman.InboundHandlerManagerFromSpace(space) if handler.inboundHandlerManager == nil { return newError("InboundHandlerManager is not found is space.") diff --git a/proxy/vmess/outbound/outbound.go b/proxy/vmess/outbound/outbound.go index 1547cc47..dd218edf 100644 --- a/proxy/vmess/outbound/outbound.go +++ b/proxy/vmess/outbound/outbound.go @@ -44,7 +44,7 @@ func New(ctx context.Context, config *Config) (*Handler, error) { serverPicker: protocol.NewRoundRobinServerPicker(serverList), } - space.OnInitialize(func() error { + space.On(app.SpaceInitializing, func(interface{}) error { pm := policy.FromSpace(space) if pm == nil { return newError("Policy is not found in space.") From cb68575444124c81556eb1b2353ccfa26c6805bc Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Wed, 29 Nov 2017 22:19:04 +0100 Subject: [PATCH 215/229] support none cipher in shadowsocks --- proxy/shadowsocks/config.go | 53 +++++++++++++++++---------- proxy/shadowsocks/config.pb.go | 65 ++++++++++++++++++---------------- proxy/shadowsocks/config.proto | 1 + proxy/shadowsocks/protocol.go | 54 +++++++++++++++++----------- 4 files changed, 104 insertions(+), 69 deletions(-) diff --git a/proxy/shadowsocks/config.go b/proxy/shadowsocks/config.go index 08dccf20..1479cc86 100644 --- a/proxy/shadowsocks/config.go +++ b/proxy/shadowsocks/config.go @@ -44,8 +44,8 @@ func createChacha20Poly1305(key []byte) cipher.AEAD { return chacha20 } -func (v *Account) GetCipher() (Cipher, error) { - switch v.CipherType { +func (a *Account) GetCipher() (Cipher, error) { + switch a.CipherType { case CipherType_AES_128_CFB: return &AesCfb{KeyBytes: 16}, nil case CipherType_AES_256_CFB: @@ -72,31 +72,25 @@ func (v *Account) GetCipher() (Cipher, error) { IVBytes: 32, AEADAuthCreator: createChacha20Poly1305, }, nil + case CipherType_NONE: + return NoneCipher{}, nil default: return nil, newError("Unsupported cipher.") } } -func (v *Account) AsAccount() (protocol.Account, error) { - cipher, err := v.GetCipher() +func (a *Account) AsAccount() (protocol.Account, error) { + cipher, err := a.GetCipher() if err != nil { return nil, newError("failed to get cipher").Base(err) } return &ShadowsocksAccount{ Cipher: cipher, - Key: v.GetCipherKey(), - OneTimeAuth: v.Ota, + Key: PasswordToCipherKey([]byte(a.Password), cipher.KeySize()), + OneTimeAuth: a.Ota, }, nil } -func (v *Account) GetCipherKey() []byte { - ct, err := v.GetCipher() - if err != nil { - return nil - } - return PasswordToCipherKey(v.Password, ct.KeySize()) -} - type Cipher interface { KeySize() int IVSize() int @@ -261,17 +255,40 @@ func (v *ChaCha20) DecodePacket(key []byte, b *buf.Buffer) error { return nil } -func PasswordToCipherKey(password string, keySize int) []byte { - pwdBytes := []byte(password) +type NoneCipher struct{} + +func (NoneCipher) KeySize() int { return 0 } +func (NoneCipher) IVSize() int { return 0 } +func (NoneCipher) IsAEAD() bool { + return true // to avoid OTA +} + +func (NoneCipher) NewDecryptionReader(key []byte, iv []byte, reader io.Reader) (buf.Reader, error) { + return buf.NewReader(reader), nil +} + +func (NoneCipher) NewEncryptionWriter(key []byte, iv []byte, writer io.Writer) (buf.Writer, error) { + return buf.NewWriter(writer), nil +} + +func (NoneCipher) EncodePacket(key []byte, b *buf.Buffer) error { + return nil +} + +func (NoneCipher) DecodePacket(key []byte, b *buf.Buffer) error { + return nil +} + +func PasswordToCipherKey(password []byte, keySize int) []byte { key := make([]byte, 0, keySize) - md5Sum := md5.Sum(pwdBytes) + md5Sum := md5.Sum(password) key = append(key, md5Sum[:]...) for len(key) < keySize { md5Hash := md5.New() md5Hash.Write(md5Sum[:]) - md5Hash.Write(pwdBytes) + md5Hash.Write(password) md5Hash.Sum(md5Sum[:0]) key = append(key, md5Sum[:]...) diff --git a/proxy/shadowsocks/config.pb.go b/proxy/shadowsocks/config.pb.go index 7549ffed..bd7cd3b6 100644 --- a/proxy/shadowsocks/config.pb.go +++ b/proxy/shadowsocks/config.pb.go @@ -28,6 +28,7 @@ const ( CipherType_AES_128_GCM CipherType = 5 CipherType_AES_256_GCM CipherType = 6 CipherType_CHACHA20_POLY1305 CipherType = 7 + CipherType_NONE CipherType = 8 ) var CipherType_name = map[int32]string{ @@ -39,6 +40,7 @@ var CipherType_name = map[int32]string{ 5: "AES_128_GCM", 6: "AES_256_GCM", 7: "CHACHA20_POLY1305", + 8: "NONE", } var CipherType_value = map[string]int32{ "UNKNOWN": 0, @@ -49,6 +51,7 @@ var CipherType_value = map[string]int32{ "AES_128_GCM": 5, "AES_256_GCM": 6, "CHACHA20_POLY1305": 7, + "NONE": 8, } func (x CipherType) String() string { @@ -163,35 +166,35 @@ func init() { func init() { proto.RegisterFile("v2ray.com/core/proxy/shadowsocks/config.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 470 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0xd1, 0x8e, 0xd2, 0x40, - 0x14, 0x86, 0xb7, 0x80, 0x80, 0xa7, 0xa8, 0xdd, 0x49, 0x4c, 0x08, 0xd9, 0x44, 0xc2, 0x15, 0x6e, - 0xe2, 0x14, 0xba, 0xae, 0xf1, 0xb6, 0x8c, 0xac, 0xbb, 0x51, 0x81, 0x14, 0x56, 0xa3, 0x37, 0x4d, - 0x77, 0x3a, 0x4a, 0x23, 0xed, 0x4c, 0x66, 0xda, 0x5d, 0xfb, 0x20, 0xbe, 0x84, 0x6f, 0xe6, 0x5b, - 0x98, 0x4e, 0x81, 0x6d, 0xbc, 0x60, 0xef, 0x7a, 0x4e, 0xff, 0xff, 0xef, 0x7f, 0xbe, 0xc2, 0xab, - 0x5b, 0x47, 0x06, 0x39, 0xa6, 0x3c, 0xb6, 0x29, 0x97, 0xcc, 0x16, 0x92, 0xff, 0xca, 0x6d, 0xb5, - 0x0e, 0x42, 0x7e, 0xa7, 0x38, 0xfd, 0xa9, 0x6c, 0xca, 0x93, 0xef, 0xd1, 0x0f, 0x2c, 0x24, 0x4f, - 0x39, 0x3a, 0xd9, 0xc9, 0x25, 0xc3, 0x5a, 0x8a, 0x2b, 0xd2, 0xde, 0xcb, 0xff, 0xc2, 0x28, 0x8f, - 0x63, 0x9e, 0xd8, 0xda, 0x4a, 0xf9, 0xc6, 0xce, 0x14, 0x93, 0x65, 0x50, 0x6f, 0xf4, 0x80, 0x54, - 0x31, 0x79, 0xcb, 0xa4, 0xaf, 0x04, 0xa3, 0xa5, 0x63, 0xf0, 0xd7, 0x80, 0x96, 0x4b, 0x29, 0xcf, - 0x92, 0x14, 0xf5, 0xa0, 0x2d, 0x02, 0xa5, 0xee, 0xb8, 0x0c, 0xbb, 0x46, 0xdf, 0x18, 0x3e, 0xf6, - 0xf6, 0x33, 0xba, 0x02, 0x93, 0x46, 0x62, 0xcd, 0xa4, 0x9f, 0xe6, 0x82, 0x75, 0x6b, 0x7d, 0x63, - 0xf8, 0xd4, 0x19, 0xe2, 0x43, 0xc5, 0x31, 0xd1, 0x86, 0x55, 0x2e, 0x98, 0x07, 0x74, 0xff, 0x8c, - 0x08, 0xd4, 0x79, 0x1a, 0x74, 0xeb, 0x3a, 0x62, 0x7c, 0x38, 0x62, 0x5b, 0x0d, 0xcf, 0x13, 0xb6, - 0x8a, 0x62, 0xe6, 0x66, 0xe9, 0xda, 0x2b, 0xdc, 0x03, 0x07, 0xcc, 0xca, 0x0e, 0xb5, 0xa1, 0xe1, - 0x66, 0x29, 0xb7, 0x8e, 0x50, 0x07, 0xda, 0xef, 0x22, 0x15, 0xdc, 0x6c, 0x58, 0x68, 0x19, 0xc8, - 0x84, 0xd6, 0x34, 0x29, 0x87, 0xda, 0x80, 0x41, 0x67, 0xa9, 0x01, 0x10, 0x0d, 0x1f, 0xbd, 0x00, - 0x33, 0x0b, 0x85, 0xcf, 0x4a, 0x81, 0x3e, 0xb9, 0xed, 0x41, 0x16, 0x8a, 0xad, 0x05, 0xbd, 0x86, - 0x46, 0x01, 0x57, 0x5f, 0x6b, 0x3a, 0xfd, 0x6a, 0xd5, 0x92, 0x2c, 0xde, 0x91, 0xc5, 0xd7, 0x8a, - 0x49, 0x4f, 0xab, 0x07, 0x1e, 0x74, 0xc8, 0x26, 0x62, 0x49, 0xba, 0xfd, 0xcc, 0x04, 0x9a, 0x25, - 0xf7, 0xae, 0xd1, 0xaf, 0x0f, 0x4d, 0xe7, 0xf4, 0x50, 0x4e, 0x59, 0x70, 0x9a, 0x84, 0x82, 0x47, - 0x49, 0xea, 0x6d, 0x9d, 0xa7, 0xbf, 0x0d, 0x80, 0x7b, 0x9c, 0xc5, 0x59, 0xd7, 0xb3, 0x0f, 0xb3, - 0xf9, 0x97, 0x99, 0x75, 0x84, 0x9e, 0x81, 0xe9, 0x4e, 0x97, 0xfe, 0xd8, 0x79, 0xeb, 0x93, 0x8b, - 0x89, 0x65, 0xec, 0x16, 0xce, 0xf9, 0x1b, 0xbd, 0xa8, 0x15, 0x4c, 0xc8, 0xa5, 0x4b, 0x2e, 0x5d, - 0x67, 0x64, 0xd5, 0xd1, 0x31, 0x3c, 0xd9, 0x4d, 0xfe, 0xd5, 0x74, 0x75, 0x61, 0x35, 0xaa, 0x11, - 0xef, 0xc9, 0x27, 0xeb, 0x51, 0x35, 0xa2, 0x58, 0x34, 0xd1, 0x73, 0x38, 0xde, 0x9b, 0x16, 0xf3, - 0x8f, 0x5f, 0xc7, 0x67, 0xa3, 0x73, 0xab, 0x35, 0x59, 0x40, 0x9f, 0xf2, 0xf8, 0xe0, 0x3f, 0x5c, - 0x18, 0xdf, 0xcc, 0xca, 0xf8, 0xa7, 0x76, 0xf2, 0xd9, 0xf1, 0x82, 0x1c, 0x93, 0x42, 0xbd, 0xd0, - 0xea, 0xe5, 0xfd, 0xeb, 0x9b, 0xa6, 0x46, 0x71, 0xf6, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x37, 0x7d, - 0x8e, 0xab, 0x43, 0x03, 0x00, 0x00, + // 477 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0x51, 0x8f, 0x93, 0x40, + 0x14, 0x85, 0x97, 0xb6, 0xb6, 0xf5, 0x52, 0x95, 0x9d, 0xc4, 0xa4, 0x69, 0x36, 0xb1, 0xe9, 0x53, + 0xdd, 0xc4, 0xa1, 0x65, 0x5d, 0xe3, 0x2b, 0x45, 0xd6, 0xdd, 0xa8, 0xb4, 0xa1, 0x5d, 0x8d, 0xbe, + 0x10, 0x76, 0x18, 0x2d, 0xb1, 0x30, 0x93, 0x19, 0xd8, 0x95, 0x5f, 0xe3, 0xbb, 0xff, 0xcc, 0x7f, + 0x61, 0x18, 0xda, 0x2e, 0xf1, 0xa1, 0xfb, 0xc6, 0xbd, 0x9c, 0x73, 0x38, 0xf7, 0x03, 0x5e, 0xdd, + 0x5a, 0x22, 0x2c, 0x30, 0x61, 0x89, 0x49, 0x98, 0xa0, 0x26, 0x17, 0xec, 0x57, 0x61, 0xca, 0x75, + 0x18, 0xb1, 0x3b, 0xc9, 0xc8, 0x4f, 0x69, 0x12, 0x96, 0x7e, 0x8f, 0x7f, 0x60, 0x2e, 0x58, 0xc6, + 0xd0, 0xc9, 0x4e, 0x2e, 0x28, 0x56, 0x52, 0x5c, 0x93, 0x0e, 0x5e, 0xfe, 0x17, 0x46, 0x58, 0x92, + 0xb0, 0xd4, 0x54, 0x56, 0xc2, 0x36, 0x66, 0x2e, 0xa9, 0xa8, 0x82, 0x06, 0x93, 0x07, 0xa4, 0x92, + 0x8a, 0x5b, 0x2a, 0x02, 0xc9, 0x29, 0xa9, 0x1c, 0xa3, 0xbf, 0x1a, 0x74, 0x6c, 0x42, 0x58, 0x9e, + 0x66, 0x68, 0x00, 0x5d, 0x1e, 0x4a, 0x79, 0xc7, 0x44, 0xd4, 0xd7, 0x86, 0xda, 0xf8, 0xb1, 0xbf, + 0x9f, 0xd1, 0x15, 0xe8, 0x24, 0xe6, 0x6b, 0x2a, 0x82, 0xac, 0xe0, 0xb4, 0xdf, 0x18, 0x6a, 0xe3, + 0xa7, 0xd6, 0x18, 0x1f, 0x2a, 0x8e, 0x1d, 0x65, 0x58, 0x15, 0x9c, 0xfa, 0x40, 0xf6, 0xcf, 0xc8, + 0x81, 0x26, 0xcb, 0xc2, 0x7e, 0x53, 0x45, 0x4c, 0x0f, 0x47, 0x6c, 0xab, 0xe1, 0x79, 0x4a, 0x57, + 0x71, 0x42, 0xed, 0x3c, 0x5b, 0xfb, 0xa5, 0x7b, 0x64, 0x81, 0x5e, 0xdb, 0xa1, 0x2e, 0xb4, 0xec, + 0x3c, 0x63, 0xc6, 0x11, 0xea, 0x41, 0xf7, 0x5d, 0x2c, 0xc3, 0x9b, 0x0d, 0x8d, 0x0c, 0x0d, 0xe9, + 0xd0, 0x71, 0xd3, 0x6a, 0x68, 0x8c, 0x28, 0xf4, 0x96, 0x0a, 0x80, 0xa3, 0xe0, 0xa3, 0x17, 0xa0, + 0xe7, 0x11, 0x0f, 0x68, 0x25, 0x50, 0x27, 0x77, 0x7d, 0xc8, 0x23, 0xbe, 0xb5, 0xa0, 0xd7, 0xd0, + 0x2a, 0xe1, 0xaa, 0x6b, 0x75, 0x6b, 0x58, 0xaf, 0x5a, 0x91, 0xc5, 0x3b, 0xb2, 0xf8, 0x5a, 0x52, + 0xe1, 0x2b, 0xf5, 0xc8, 0x87, 0x9e, 0xb3, 0x89, 0x69, 0x9a, 0x6d, 0x3f, 0x33, 0x83, 0x76, 0xc5, + 0xbd, 0xaf, 0x0d, 0x9b, 0x63, 0xdd, 0x3a, 0x3d, 0x94, 0x53, 0x15, 0x74, 0xd3, 0x88, 0xb3, 0x38, + 0xcd, 0xfc, 0xad, 0xf3, 0xf4, 0xb7, 0x06, 0x70, 0x8f, 0xb3, 0x3c, 0xeb, 0xda, 0xfb, 0xe0, 0xcd, + 0xbf, 0x78, 0xc6, 0x11, 0x7a, 0x06, 0xba, 0xed, 0x2e, 0x83, 0xa9, 0xf5, 0x36, 0x70, 0x2e, 0x66, + 0x86, 0xb6, 0x5b, 0x58, 0xe7, 0x6f, 0xd4, 0xa2, 0x51, 0x32, 0x71, 0x2e, 0x6d, 0xe7, 0xd2, 0xb6, + 0x26, 0x46, 0x13, 0x1d, 0xc3, 0x93, 0xdd, 0x14, 0x5c, 0xb9, 0xab, 0x0b, 0xa3, 0x55, 0x8f, 0x78, + 0xef, 0x7c, 0x32, 0x1e, 0xd5, 0x23, 0xca, 0x45, 0x1b, 0x3d, 0x87, 0xe3, 0xbd, 0x69, 0x31, 0xff, + 0xf8, 0x75, 0x7a, 0x36, 0x39, 0x37, 0x3a, 0x25, 0x77, 0x6f, 0xee, 0xb9, 0x46, 0x77, 0xb6, 0x80, + 0x21, 0x61, 0xc9, 0xc1, 0xbf, 0xb9, 0xd0, 0xbe, 0xe9, 0xb5, 0xf1, 0x4f, 0xe3, 0xe4, 0xb3, 0xe5, + 0x87, 0x05, 0x76, 0x4a, 0xf5, 0x42, 0xa9, 0x97, 0xf7, 0xaf, 0x6f, 0xda, 0x0a, 0xca, 0xd9, 0xbf, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x02, 0xd5, 0x9f, 0x8c, 0x4d, 0x03, 0x00, 0x00, } diff --git a/proxy/shadowsocks/config.proto b/proxy/shadowsocks/config.proto index 4323ef04..a9a9fb5a 100644 --- a/proxy/shadowsocks/config.proto +++ b/proxy/shadowsocks/config.proto @@ -29,6 +29,7 @@ enum CipherType { AES_128_GCM = 5; AES_256_GCM = 6; CHACHA20_POLY1305 = 7; + NONE = 8; } message ServerConfig { diff --git a/proxy/shadowsocks/protocol.go b/proxy/shadowsocks/protocol.go index 819ed884..eb45bbf6 100644 --- a/proxy/shadowsocks/protocol.go +++ b/proxy/shadowsocks/protocol.go @@ -33,11 +33,14 @@ func ReadTCPSession(user *protocol.User, reader io.Reader) (*protocol.RequestHea defer buffer.Release() ivLen := account.Cipher.IVSize() - if err := buffer.AppendSupplier(buf.ReadFullFrom(reader, ivLen)); err != nil { - return nil, nil, newError("failed to read IV").Base(err) - } + var iv []byte + if ivLen > 0 { + if err := buffer.AppendSupplier(buf.ReadFullFrom(reader, ivLen)); err != nil { + return nil, nil, newError("failed to read IV").Base(err) + } - iv := append([]byte(nil), buffer.BytesTo(ivLen)...) + iv = append([]byte(nil), buffer.BytesTo(ivLen)...) + } r, err := account.Cipher.NewDecryptionReader(account.Key, iv, reader) if err != nil { @@ -145,11 +148,14 @@ func WriteTCPRequest(request *protocol.RequestHeader, writer io.Writer) (buf.Wri request.Option.Clear(RequestOptionOneTimeAuth) } - iv := make([]byte, account.Cipher.IVSize()) - common.Must2(rand.Read(iv)) - _, err = writer.Write(iv) - if err != nil { - return nil, newError("failed to write IV") + var iv []byte + if account.Cipher.IVSize() > 0 { + iv = make([]byte, account.Cipher.IVSize()) + common.Must2(rand.Read(iv)) + _, err = writer.Write(iv) + if err != nil { + return nil, newError("failed to write IV") + } } w, err := account.Cipher.NewEncryptionWriter(account.Key, iv, writer) @@ -207,10 +213,13 @@ func ReadTCPResponse(user *protocol.User, reader io.Reader) (buf.Reader, error) } account := rawAccount.(*ShadowsocksAccount) - iv := make([]byte, account.Cipher.IVSize()) - _, err = io.ReadFull(reader, iv) - if err != nil { - return nil, newError("failed to read IV").Base(err) + var iv []byte + if account.Cipher.IVSize() > 0 { + iv = make([]byte, account.Cipher.IVSize()) + _, err = io.ReadFull(reader, iv) + if err != nil { + return nil, newError("failed to read IV").Base(err) + } } return account.Cipher.NewDecryptionReader(account.Key, iv, reader) @@ -224,11 +233,14 @@ func WriteTCPResponse(request *protocol.RequestHeader, writer io.Writer) (buf.Wr } account := rawAccount.(*ShadowsocksAccount) - iv := make([]byte, account.Cipher.IVSize()) - common.Must2(rand.Read(iv)) - _, err = writer.Write(iv) - if err != nil { - return nil, newError("failed to write IV.").Base(err) + var iv []byte + if account.Cipher.IVSize() > 0 { + iv = make([]byte, account.Cipher.IVSize()) + common.Must2(rand.Read(iv)) + _, err = writer.Write(iv) + if err != nil { + return nil, newError("failed to write IV.").Base(err) + } } return account.Cipher.NewEncryptionWriter(account.Key, iv, writer) @@ -244,7 +256,9 @@ func EncodeUDPPacket(request *protocol.RequestHeader, payload []byte) (*buf.Buff buffer := buf.New() ivLen := account.Cipher.IVSize() - common.Must(buffer.Reset(buf.ReadFullFrom(rand.Reader, ivLen))) + if ivLen > 0 { + common.Must(buffer.Reset(buf.ReadFullFrom(rand.Reader, ivLen))) + } iv := buffer.Bytes() switch request.Address.Family() { @@ -286,7 +300,7 @@ func DecodeUDPPacket(user *protocol.User, payload *buf.Buffer) (*protocol.Reques var iv []byte var authenticator *Authenticator - if !account.Cipher.IsAEAD() { + if !account.Cipher.IsAEAD() && account.Cipher.IVSize() > 0 { // Keep track of IV as it gets removed from payload in DecodePacket. iv = make([]byte, account.Cipher.IVSize()) copy(iv, payload.BytesTo(account.Cipher.IVSize())) From f6bb214d30da177c29d3a91e2d967056e0138a32 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Wed, 29 Nov 2017 22:57:18 +0100 Subject: [PATCH 216/229] fix lint warnings --- proxy/shadowsocks/client.go | 2 +- proxy/shadowsocks/config.go | 27 ++++++++++++++++----------- proxy/shadowsocks/ota.go | 3 ++- proxy/shadowsocks/protocol.go | 12 ++++++------ proxy/shadowsocks/server.go | 4 ++-- 5 files changed, 27 insertions(+), 21 deletions(-) diff --git a/proxy/shadowsocks/client.go b/proxy/shadowsocks/client.go index 231834e9..d86127c2 100644 --- a/proxy/shadowsocks/client.go +++ b/proxy/shadowsocks/client.go @@ -97,7 +97,7 @@ func (v *Client) Process(ctx context.Context, outboundRay ray.OutboundRay, diale if err != nil { return newError("failed to get a valid user account").AtWarning().Base(err) } - account := rawAccount.(*ShadowsocksAccount) + account := rawAccount.(*MemoryAccount) request.User = user if account.OneTimeAuth == Account_Auto || account.OneTimeAuth == Account_Enabled { diff --git a/proxy/shadowsocks/config.go b/proxy/shadowsocks/config.go index 1479cc86..54de878f 100644 --- a/proxy/shadowsocks/config.go +++ b/proxy/shadowsocks/config.go @@ -17,15 +17,17 @@ import ( "v2ray.com/core/common/protocol" ) -type ShadowsocksAccount struct { +// MemoryAccount is an account type converted from Account. +type MemoryAccount struct { Cipher Cipher Key []byte OneTimeAuth Account_OneTimeAuth } -func (v *ShadowsocksAccount) Equals(another protocol.Account) bool { - if account, ok := another.(*ShadowsocksAccount); ok { - return bytes.Equal(v.Key, account.Key) +// Equals implements protocol.Account.Equals(). +func (a *MemoryAccount) Equals(another protocol.Account) bool { + if account, ok := another.(*MemoryAccount); ok { + return bytes.Equal(a.Key, account.Key) } return false } @@ -44,7 +46,7 @@ func createChacha20Poly1305(key []byte) cipher.AEAD { return chacha20 } -func (a *Account) GetCipher() (Cipher, error) { +func (a *Account) getCipher() (Cipher, error) { switch a.CipherType { case CipherType_AES_128_CFB: return &AesCfb{KeyBytes: 16}, nil @@ -79,18 +81,20 @@ func (a *Account) GetCipher() (Cipher, error) { } } +// AsAccount implements protocol.AsAccount. func (a *Account) AsAccount() (protocol.Account, error) { - cipher, err := a.GetCipher() + cipher, err := a.getCipher() if err != nil { return nil, newError("failed to get cipher").Base(err) } - return &ShadowsocksAccount{ + return &MemoryAccount{ Cipher: cipher, - Key: PasswordToCipherKey([]byte(a.Password), cipher.KeySize()), + Key: passwordToCipherKey([]byte(a.Password), cipher.KeySize()), OneTimeAuth: a.Ota, }, nil } +// Cipher is an interface for all Shadowsocks ciphers. type Cipher interface { KeySize() int IVSize() int @@ -101,6 +105,7 @@ type Cipher interface { DecodePacket(key []byte, b *buf.Buffer) error } +// AesCfb represents all AES-CFB ciphers. type AesCfb struct { KeyBytes int } @@ -279,7 +284,7 @@ func (NoneCipher) DecodePacket(key []byte, b *buf.Buffer) error { return nil } -func PasswordToCipherKey(password []byte, keySize int) []byte { +func passwordToCipherKey(password []byte, keySize int) []byte { key := make([]byte, 0, keySize) md5Sum := md5.Sum(password) @@ -287,8 +292,8 @@ func PasswordToCipherKey(password []byte, keySize int) []byte { for len(key) < keySize { md5Hash := md5.New() - md5Hash.Write(md5Sum[:]) - md5Hash.Write(password) + common.Must2(md5Hash.Write(md5Sum[:])) + common.Must2(md5Hash.Write(password)) md5Hash.Sum(md5Sum[:0]) key = append(key, md5Sum[:]...) diff --git a/proxy/shadowsocks/ota.go b/proxy/shadowsocks/ota.go index 91549b82..3d939682 100644 --- a/proxy/shadowsocks/ota.go +++ b/proxy/shadowsocks/ota.go @@ -6,6 +6,7 @@ import ( "crypto/sha1" "io" + "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/serial" ) @@ -29,7 +30,7 @@ func NewAuthenticator(keygen KeyGenerator) *Authenticator { func (v *Authenticator) Authenticate(data []byte) buf.Supplier { hasher := hmac.New(sha1.New, v.key()) - hasher.Write(data) + common.Must2(hasher.Write(data)) res := hasher.Sum(nil) return func(b []byte) (int, error) { return copy(b, res[:AuthSize]), nil diff --git a/proxy/shadowsocks/protocol.go b/proxy/shadowsocks/protocol.go index eb45bbf6..3dfdfc88 100644 --- a/proxy/shadowsocks/protocol.go +++ b/proxy/shadowsocks/protocol.go @@ -27,7 +27,7 @@ func ReadTCPSession(user *protocol.User, reader io.Reader) (*protocol.RequestHea if err != nil { return nil, nil, newError("failed to parse account").Base(err).AtError() } - account := rawAccount.(*ShadowsocksAccount) + account := rawAccount.(*MemoryAccount) buffer := buf.NewLocal(512) defer buffer.Release() @@ -142,7 +142,7 @@ func WriteTCPRequest(request *protocol.RequestHeader, writer io.Writer) (buf.Wri if err != nil { return nil, newError("failed to parse account").Base(err).AtError() } - account := rawAccount.(*ShadowsocksAccount) + account := rawAccount.(*MemoryAccount) if account.Cipher.IsAEAD() { request.Option.Clear(RequestOptionOneTimeAuth) @@ -211,7 +211,7 @@ func ReadTCPResponse(user *protocol.User, reader io.Reader) (buf.Reader, error) if err != nil { return nil, newError("failed to parse account").Base(err).AtError() } - account := rawAccount.(*ShadowsocksAccount) + account := rawAccount.(*MemoryAccount) var iv []byte if account.Cipher.IVSize() > 0 { @@ -231,7 +231,7 @@ func WriteTCPResponse(request *protocol.RequestHeader, writer io.Writer) (buf.Wr if err != nil { return nil, newError("failed to parse account.").Base(err).AtError() } - account := rawAccount.(*ShadowsocksAccount) + account := rawAccount.(*MemoryAccount) var iv []byte if account.Cipher.IVSize() > 0 { @@ -252,7 +252,7 @@ func EncodeUDPPacket(request *protocol.RequestHeader, payload []byte) (*buf.Buff if err != nil { return nil, newError("failed to parse account.").Base(err).AtError() } - account := rawAccount.(*ShadowsocksAccount) + account := rawAccount.(*MemoryAccount) buffer := buf.New() ivLen := account.Cipher.IVSize() @@ -296,7 +296,7 @@ func DecodeUDPPacket(user *protocol.User, payload *buf.Buffer) (*protocol.Reques if err != nil { return nil, nil, newError("failed to parse account").Base(err).AtError() } - account := rawAccount.(*ShadowsocksAccount) + account := rawAccount.(*MemoryAccount) var iv []byte var authenticator *Authenticator diff --git a/proxy/shadowsocks/server.go b/proxy/shadowsocks/server.go index 023840d3..52434fcb 100644 --- a/proxy/shadowsocks/server.go +++ b/proxy/shadowsocks/server.go @@ -21,7 +21,7 @@ import ( type Server struct { config *ServerConfig user *protocol.User - account *ShadowsocksAccount + account *MemoryAccount policyManager policy.Manager } @@ -39,7 +39,7 @@ func NewServer(ctx context.Context, config *ServerConfig) (*Server, error) { if err != nil { return nil, newError("failed to get user account").Base(err) } - account := rawAccount.(*ShadowsocksAccount) + account := rawAccount.(*MemoryAccount) s := &Server{ config: config, From 3aa5102036dcfcd9e5b6b454c2b1a9e819997b7a Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Wed, 29 Nov 2017 23:08:02 +0100 Subject: [PATCH 217/229] lazy init of authenticator --- proxy/shadowsocks/protocol.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/proxy/shadowsocks/protocol.go b/proxy/shadowsocks/protocol.go index 3dfdfc88..27f1520e 100644 --- a/proxy/shadowsocks/protocol.go +++ b/proxy/shadowsocks/protocol.go @@ -299,7 +299,6 @@ func DecodeUDPPacket(user *protocol.User, payload *buf.Buffer) (*protocol.Reques account := rawAccount.(*MemoryAccount) var iv []byte - var authenticator *Authenticator if !account.Cipher.IsAEAD() && account.Cipher.IVSize() > 0 { // Keep track of IV as it gets removed from payload in DecodePacket. iv = make([]byte, account.Cipher.IVSize()) @@ -333,7 +332,7 @@ func DecodeUDPPacket(user *protocol.User, payload *buf.Buffer) (*protocol.Reques payloadLen := payload.Len() - AuthSize authBytes := payload.BytesFrom(payloadLen) - authenticator = NewAuthenticator(HeaderKeyGenerator(account.Key, iv)) + authenticator := NewAuthenticator(HeaderKeyGenerator(account.Key, iv)) actualAuth := make([]byte, AuthSize) authenticator.Authenticate(payload.BytesTo(payloadLen))(actualAuth) if !bytes.Equal(actualAuth, authBytes) { From 21bcf64f0fb2b74f652739e2f6c983d65d531aa5 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Thu, 30 Nov 2017 12:55:31 +0100 Subject: [PATCH 218/229] comments --- app/space.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/space.go b/app/space.go index c307559b..f30775ce 100644 --- a/app/space.go +++ b/app/space.go @@ -38,6 +38,7 @@ type Space interface { } const ( + // SpaceInitializing is an event to be fired when Space is being initialized. SpaceInitializing event.Event = iota ) @@ -47,6 +48,7 @@ type spaceImpl struct { initialized bool } +// NewSpace creates a new Space. func NewSpace() Space { return &spaceImpl{ cache: make(map[reflect.Type]Application), From f245d9d9633469c01c84c11268a418cf8469e1d0 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Thu, 30 Nov 2017 13:01:25 +0100 Subject: [PATCH 219/229] update version --- core.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core.go b/core.go index 458f8ba2..0c37e22c 100644 --- a/core.go +++ b/core.go @@ -18,9 +18,9 @@ import ( ) var ( - version = "2.52" + version = "3.0" build = "Custom" - codename = "One for all" + codename = "die Commanderin" intro = "An unified platform for anti-censorship." ) From 1407bf8ce4bc21c85a44157efd4eccb84ad63137 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Thu, 30 Nov 2017 16:59:00 +0100 Subject: [PATCH 220/229] Update version --- core.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core.go b/core.go index 0c37e22c..f59caa62 100644 --- a/core.go +++ b/core.go @@ -18,7 +18,7 @@ import ( ) var ( - version = "3.0" + version = "3.1" build = "Custom" codename = "die Commanderin" intro = "An unified platform for anti-censorship." From b0b65cb3fa0144a51ec57056e12099b6de603558 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Thu, 30 Nov 2017 20:59:12 +0100 Subject: [PATCH 221/229] chacha20 confermance test --- testing/scenarios/shadowsocks_test.go | 79 +++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/testing/scenarios/shadowsocks_test.go b/testing/scenarios/shadowsocks_test.go index 50235837..ae3f611c 100644 --- a/testing/scenarios/shadowsocks_test.go +++ b/testing/scenarios/shadowsocks_test.go @@ -773,3 +773,82 @@ func TestShadowsocksChacha20Poly1305UDPConformance(t *testing.T) { CloseAllServers(servers) } + +func TestShadowsocksChacha20Conformance(t *testing.T) { + assert := With(t) + + tcpServer := tcp.Server{ + MsgProcessor: xor, + } + dest, err := tcpServer.Start() + assert(err, IsNil) + defer tcpServer.Close() + + account := serial.ToTypedMessage(&shadowsocks.Account{ + Password: "ss-password", + CipherType: shadowsocks.CipherType_CHACHA20_IETF, + Ota: shadowsocks.Account_Disabled, + }) + + serverPort := pickPort() + serverConfig := &core.Config{ + App: []*serial.TypedMessage{ + serial.ToTypedMessage(&log.Config{ + ErrorLogLevel: log.LogLevel_Debug, + ErrorLogType: log.LogType_Console, + }), + }, + Inbound: []*proxyman.InboundHandlerConfig{ + { + ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ + PortRange: net.SinglePortRange(serverPort), + Listen: net.NewIPOrDomain(net.LocalHostIP), + }), + ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{ + User: &protocol.User{ + Account: account, + Level: 1, + }, + }), + }, + }, + Outbound: []*proxyman.OutboundHandlerConfig{ + { + ProxySettings: serial.ToTypedMessage(&freedom.Config{}), + }, + }, + } + + servers, err := InitializeServerConfigs(serverConfig) + assert(err, IsNil) + + var wg sync.WaitGroup + wg.Add(10) + for i := 0; i < 10; i++ { + go func() { + cipher, err := ss.PickCipher("CHACHA20-IETF", nil, "ss-password") + assert(err, IsNil) + conn, err := ss.Dial("tcp", fmt.Sprintf(":%d", serverPort), cipher) + assert(err, IsNil) + _, err = conn.Write([]byte{1, 127, 0, 0, 1}) + assert(err, IsNil) + _, err = conn.Write(serial.Uint16ToBytes(dest.Port.Value(), nil)) + assert(err, IsNil) + + payload := make([]byte, 10240*1024) + rand.Read(payload) + + nBytes, err := conn.Write([]byte(payload)) + assert(err, IsNil) + assert(nBytes, Equals, len(payload)) + + response := readFrom(conn, time.Second*30, 10240*1024) + assert(response, Equals, xor([]byte(payload))) + assert(conn.Close(), IsNil) + wg.Done() + }() + } + wg.Wait() + + CloseAllServers(servers) +} From 9caa59c827cbdd01ef7ff40a3aa1af0c4c8b91f2 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 1 Dec 2017 00:47:17 +0100 Subject: [PATCH 222/229] move ctx into function --- common/signal/timer.go | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/common/signal/timer.go b/common/signal/timer.go index bc2a0bd1..6d1d8213 100644 --- a/common/signal/timer.go +++ b/common/signal/timer.go @@ -12,8 +12,6 @@ type ActivityUpdater interface { type ActivityTimer struct { updated chan bool timeout chan time.Duration - ctx context.Context - cancel context.CancelFunc } func (t *ActivityTimer) Update() { @@ -27,7 +25,7 @@ func (t *ActivityTimer) SetTimeout(timeout time.Duration) { t.timeout <- timeout } -func (t *ActivityTimer) run() { +func (t *ActivityTimer) run(ctx context.Context, cancel context.CancelFunc) { ticker := time.NewTicker(<-t.timeout) defer func() { ticker.Stop() @@ -36,23 +34,24 @@ func (t *ActivityTimer) run() { for { select { case <-ticker.C: - case <-t.ctx.Done(): + case <-ctx.Done(): return case timeout := <-t.timeout: if timeout == 0 { - t.cancel() + cancel() return } ticker.Stop() ticker = time.NewTicker(timeout) + continue } select { case <-t.updated: // Updated keep waiting. default: - t.cancel() + cancel() return } } @@ -60,12 +59,10 @@ func (t *ActivityTimer) run() { func CancelAfterInactivity(ctx context.Context, cancel context.CancelFunc, timeout time.Duration) *ActivityTimer { timer := &ActivityTimer{ - ctx: ctx, - cancel: cancel, timeout: make(chan time.Duration, 1), updated: make(chan bool, 1), } timer.timeout <- timeout - go timer.run() + go timer.run(ctx, cancel) return timer } From 9ff0dc7327183a27a661beeb9d5f2de1913f8ee1 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 1 Dec 2017 10:36:08 +0100 Subject: [PATCH 223/229] remove struct scoped context --- proxy/vmess/vmess.go | 8 +++----- transport/internet/tcp/hub.go | 8 +++----- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/proxy/vmess/vmess.go b/proxy/vmess/vmess.go index 50928046..47baf2f6 100644 --- a/proxy/vmess/vmess.go +++ b/proxy/vmess/vmess.go @@ -30,7 +30,6 @@ type idEntry struct { type TimedUserValidator struct { sync.RWMutex - ctx context.Context validUsers []*protocol.User userHash map[[16]byte]indexTimePair ids []*idEntry @@ -45,14 +44,13 @@ type indexTimePair struct { func NewTimedUserValidator(ctx context.Context, hasher protocol.IDHash) protocol.UserValidator { tus := &TimedUserValidator{ - ctx: ctx, validUsers: make([]*protocol.User, 0, 16), userHash: make(map[[16]byte]indexTimePair, 512), ids: make([]*idEntry, 0, 512), hasher: hasher, baseTime: protocol.Timestamp(time.Now().Unix() - cacheDurationSec*3), } - go tus.updateUserHash(updateIntervalSec * time.Second) + go tus.updateUserHash(ctx, updateIntervalSec*time.Second) return tus } @@ -80,7 +78,7 @@ func (v *TimedUserValidator) generateNewHashes(nowSec protocol.Timestamp, idx in } } -func (v *TimedUserValidator) updateUserHash(interval time.Duration) { +func (v *TimedUserValidator) updateUserHash(ctx context.Context, interval time.Duration) { for { select { case now := <-time.After(interval): @@ -90,7 +88,7 @@ func (v *TimedUserValidator) updateUserHash(interval time.Duration) { v.generateNewHashes(nowSec, entry.userIdx, entry) } v.Unlock() - case <-v.ctx.Done(): + case <-ctx.Done(): return } } diff --git a/transport/internet/tcp/hub.go b/transport/internet/tcp/hub.go index 56a8cf7a..22a6cfb2 100644 --- a/transport/internet/tcp/hub.go +++ b/transport/internet/tcp/hub.go @@ -13,7 +13,6 @@ import ( ) type TCPListener struct { - ctx context.Context listener *net.TCPListener tlsConfig *gotls.Config authConfig internet.ConnectionAuthenticator @@ -34,7 +33,6 @@ func ListenTCP(ctx context.Context, address net.Address, port net.Port, addConn tcpSettings := networkSettings.(*Config) l := &TCPListener{ - ctx: ctx, listener: listener, config: tcpSettings, addConn: addConn, @@ -56,14 +54,14 @@ func ListenTCP(ctx context.Context, address net.Address, port net.Port, addConn } l.authConfig = auth } - go l.KeepAccepting() + go l.KeepAccepting(ctx) return l, nil } -func (v *TCPListener) KeepAccepting() { +func (v *TCPListener) KeepAccepting(ctx context.Context) { for { select { - case <-v.ctx.Done(): + case <-ctx.Done(): return default: } From a229b5cc94774228d4cfcf3c346c36a1743ddc3c Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 1 Dec 2017 14:21:13 +0100 Subject: [PATCH 224/229] install dbus for scheduled shutdown --- tools/release/release-ci.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/release/release-ci.sh b/tools/release/release-ci.sh index 4e183dd0..e74e77a1 100755 --- a/tools/release/release-ci.sh +++ b/tools/release/release-ci.sh @@ -3,7 +3,7 @@ set -x apt-get update -apt-get -y install jq git file p7zip-full +apt-get -y install jq git file p7zip-full dbus function getattr() { curl -s -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/$2/attributes/$1 From a75704987481069482d56ab4a6d41f6ef7c2533a Mon Sep 17 00:00:00 2001 From: DarienRaymond Date: Fri, 1 Dec 2017 15:55:17 +0100 Subject: [PATCH 225/229] Update ISSUE_TEMPLATE --- .github/ISSUE_TEMPLATE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE b/.github/ISSUE_TEMPLATE index 4c6d4af7..ef7c47f7 100644 --- a/.github/ISSUE_TEMPLATE +++ b/.github/ISSUE_TEMPLATE @@ -2,7 +2,7 @@ Please skip to the English section below if you don't write Chinese. 中文: 提交 Issue 之前请先阅读 [Issue 指引](https://www.v2ray.com/chapter_01/issue.html),然后回答下面的问题,谢谢。 -除非特殊情况,请完整填写所有问题,缺少信息将减慢Issue回复速度。 +除非特殊情况,请完整填写所有问题。不按模板发的 issue 将直接被关闭。 1) 你正在使用哪个版本的 V2Ray?(如果服务器和客户端使用了不同版本,请注明) @@ -48,7 +48,7 @@ Please remove the Chinese section above. English: Please read the [instruction](https://www.v2ray.com/en/get_started/issue.html) and answer the following questions before submitting your issue. Thank you. -Please answer all the questions with enough information. Lack of information will delay response. +Please answer all the questions with enough information. All issues not following this template will be closed immediately. 1) What version of V2Ray are you using (If you deploy different version on server and client, please explicitly point out)? From ed8093d9773cfadc902ee1df9dc56b064cce232c Mon Sep 17 00:00:00 2001 From: DarienRaymond Date: Fri, 1 Dec 2017 15:56:42 +0100 Subject: [PATCH 226/229] Update ISSUE_TEMPLATE --- .github/ISSUE_TEMPLATE | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/ISSUE_TEMPLATE b/.github/ISSUE_TEMPLATE index ef7c47f7..fe94ec31 100644 --- a/.github/ISSUE_TEMPLATE +++ b/.github/ISSUE_TEMPLATE @@ -41,6 +41,8 @@ Please skip to the English section below if you don't write Chinese. // 在这里附上服务器端日志 ``` +8) 其它相关的配置文件(如 Nginx)和相关日志。 + 请预览一下你填的内容再提交。 如果你已经填完上面的问卷,请把下面的英文部份删除,再提交 Issue。 @@ -87,3 +89,6 @@ Please answer all the questions with enough information. All issues not followin ``` Please review your issue before submitting. + +8) Other configurations (such as Nginx) and logs. + From b3d9433036778d79749eb4a02d5c417c8df438fd Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 1 Dec 2017 22:56:44 +0100 Subject: [PATCH 227/229] remove unused files --- tools/conf/conf.go | 16 ---------------- tools/conf/errors.generated.go | 5 ----- 2 files changed, 21 deletions(-) delete mode 100644 tools/conf/conf.go delete mode 100644 tools/conf/errors.generated.go diff --git a/tools/conf/conf.go b/tools/conf/conf.go deleted file mode 100644 index 9e1693d5..00000000 --- a/tools/conf/conf.go +++ /dev/null @@ -1,16 +0,0 @@ -package conf - -import ( - "io" - - "v2ray.com/core" - jsonconf "v2ray.com/ext/tools/conf/serial" -) - -//go:generate go run $GOPATH/src/v2ray.com/core/tools/generrorgen/main.go -pkg conf -path Tools,Conf - -func init() { - core.RegisterConfigLoader(core.ConfigFormat_JSON, func(input io.Reader) (*core.Config, error) { - return jsonconf.LoadJSONConfig(input) - }) -} diff --git a/tools/conf/errors.generated.go b/tools/conf/errors.generated.go deleted file mode 100644 index 5051189c..00000000 --- a/tools/conf/errors.generated.go +++ /dev/null @@ -1,5 +0,0 @@ -package conf - -import "v2ray.com/core/common/errors" - -func newError(values ...interface{}) *errors.Error { return errors.New(values...).Path("Tools", "Conf") } From 2c6b46ee2d761f406949ff831238ca77ce7c32b4 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 1 Dec 2017 23:18:25 +0100 Subject: [PATCH 228/229] update vscode config --- .vscode/tasks.json | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 9a035c9d..b49cfb5b 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -1,13 +1,18 @@ { - "version": "0.1.0", + "version": "2.0.0", "command": "go", - "isShellCommand": true, - "showOutput": "always", + "type": "shell", + "presentation": { + "echo": true, + "reveal": "always", + "focus": false, + "panel": "shared" + }, "tasks": [ { - "taskName": "build", + "label": "build", "args": ["v2ray.com/core/..."], - "isBuildCommand": true, + "group": "build", "problemMatcher": { "owner": "go", "fileLocation": ["relative", "${workspaceRoot}"], @@ -20,9 +25,9 @@ } }, { - "taskName": "test", + "label": "test", "args": ["-p", "1", "v2ray.com/core/..."], - "isBuildCommand": false + "group": "test" } ] } \ No newline at end of file From 0481e6fa428bbabdb0513cdbd0035e9a24392981 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sat, 2 Dec 2017 01:19:27 +0100 Subject: [PATCH 229/229] simplify chunk stream reader --- common/crypto/chunk.go | 56 +++++++----------------------------------- 1 file changed, 9 insertions(+), 47 deletions(-) diff --git a/common/crypto/chunk.go b/common/crypto/chunk.go index 5b622df6..e5411998 100644 --- a/common/crypto/chunk.go +++ b/common/crypto/chunk.go @@ -59,45 +59,24 @@ func (p *AEADChunkSizeParser) Decode(b []byte) (uint16, error) { type ChunkStreamReader struct { sizeDecoder ChunkSizeDecoder - reader buf.Reader + reader *buf.BufferedReader buffer []byte - leftOver buf.MultiBuffer leftOverSize int } func NewChunkStreamReader(sizeDecoder ChunkSizeDecoder, reader io.Reader) *ChunkStreamReader { return &ChunkStreamReader{ sizeDecoder: sizeDecoder, - reader: buf.NewReader(reader), + reader: buf.NewBufferedReader(buf.NewReader(reader)), buffer: make([]byte, sizeDecoder.SizeBytes()), - leftOver: buf.NewMultiBufferCap(16), } } -func (r *ChunkStreamReader) readAtLeast(size int) error { - mb := r.leftOver - r.leftOver = nil - for mb.Len() < size { - extra, err := r.reader.ReadMultiBuffer() - if err != nil { - mb.Release() - return err - } - mb.AppendMulti(extra) - } - r.leftOver = mb - - return nil -} - func (r *ChunkStreamReader) readSize() (uint16, error) { - if r.sizeDecoder.SizeBytes() > r.leftOver.Len() { - if err := r.readAtLeast(r.sizeDecoder.SizeBytes() - r.leftOver.Len()); err != nil { - return 0, err - } + if _, err := io.ReadFull(r.reader, r.buffer); err != nil { + return 0, err } - common.Must2(io.ReadFull(&r.leftOver, r.buffer)) return r.sizeDecoder.Decode(r.buffer) } @@ -113,31 +92,14 @@ func (r *ChunkStreamReader) ReadMultiBuffer() (buf.MultiBuffer, error) { } size = int(nextSize) } + r.leftOverSize = size - if r.leftOver.IsEmpty() { - if err := r.readAtLeast(1); err != nil { - return nil, err - } - } - - leftOverLen := r.leftOver.Len() - if size >= leftOverLen { - mb := r.leftOver - r.leftOverSize = size - leftOverLen - r.leftOver = nil + mb, err := r.reader.ReadAtMost(size) + if !mb.IsEmpty() { + r.leftOverSize -= mb.Len() return mb, nil } - - mb := r.leftOver.SliceBySize(size) - mbLen := mb.Len() - if mbLen != size { - b := buf.New() - common.Must(b.Reset(buf.ReadFullFrom(&r.leftOver, size-mbLen))) - mb.Append(b) - } - r.leftOverSize = 0 - - return mb, nil + return nil, err } type ChunkStreamWriter struct {

hvtN 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—YaDr;}s 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