Merge pull request #9564 from gyuho/membership-reconfiguration-tests

functional: add membership reconfiguration tests
This commit is contained in:
Gyuho Lee
2018-04-11 10:25:39 -07:00
committed by GitHub
11 changed files with 576 additions and 191 deletions

View File

@@ -121,6 +121,9 @@ tester-config:
failure-delay-ms: 7000
failure-shuffle: true
# For full descriptions,
# https://godoc.org/github.com/coreos/etcd/functional/rpcpb#FailureCase
failure-cases:
- SIGTERM_ONE_FOLLOWER
- SIGTERM_ONE_FOLLOWER_UNTIL_TRIGGER_SNAPSHOT
@@ -128,6 +131,8 @@ tester-config:
- SIGTERM_LEADER_UNTIL_TRIGGER_SNAPSHOT
- SIGTERM_QUORUM
- SIGTERM_ALL
- SIGQUIT_AND_REMOVE_ONE_FOLLOWER
- SIGQUIT_AND_REMOVE_ONE_FOLLOWER_UNTIL_TRIGGER_SNAPSHOT
- BLACKHOLE_PEER_PORT_TX_RX_ONE_FOLLOWER
- BLACKHOLE_PEER_PORT_TX_RX_ONE_FOLLOWER_UNTIL_TRIGGER_SNAPSHOT
- BLACKHOLE_PEER_PORT_TX_RX_LEADER
@@ -149,6 +154,9 @@ tester-config:
- NO_FAIL_WITH_STRESS
- NO_FAIL_WITH_NO_STRESS_FOR_LIVENESS
# - SIGQUIT_AND_REMOVE_LEADER
# - SIGQUIT_AND_REMOVE_LEADER_UNTIL_TRIGGER_SNAPSHOT
failpoint-commands:
- panic("etcd-tester")
# - panic("etcd-tester"),1*sleep(1000)

View File

@@ -92,7 +92,7 @@ func (srv *Server) handle_INITIAL_START_ETCD(req *rpcpb.Request) (*rpcpb.Respons
}
srv.lg.Info("created base directory", zap.String("path", srv.Member.BaseDir))
if err = srv.saveEtcdLogFile(); err != nil {
if err = srv.createEtcdLogFile(); err != nil {
return nil, err
}
@@ -215,7 +215,7 @@ func (srv *Server) stopProxy() {
}
}
func (srv *Server) saveEtcdLogFile() error {
func (srv *Server) createEtcdLogFile() error {
var err error
srv.etcdLogFile, err = os.Create(srv.Member.EtcdLogPath)
if err != nil {
@@ -469,11 +469,32 @@ func (srv *Server) handle_SIGQUIT_ETCD_AND_REMOVE_DATA() (*rpcpb.Response, error
}
srv.lg.Info("killed etcd", zap.String("signal", syscall.SIGQUIT.String()))
err = os.RemoveAll(srv.Member.BaseDir)
if err != nil {
srv.etcdLogFile.Sync()
srv.etcdLogFile.Close()
// for debugging purposes, rename instead of removing
if err = os.RemoveAll(srv.Member.BaseDir + ".backup"); err != nil {
return nil, err
}
if err = os.Rename(srv.Member.BaseDir, srv.Member.BaseDir+".backup"); err != nil {
return nil, err
}
srv.lg.Info(
"renamed",
zap.String("base-dir", srv.Member.BaseDir),
zap.String("new-dir", srv.Member.BaseDir+".backup"),
)
// create a new log file for next new member restart
if !fileutil.Exist(srv.Member.BaseDir) {
err = fileutil.TouchDirAll(srv.Member.BaseDir)
if err != nil {
return nil, err
}
}
if err = srv.createEtcdLogFile(); err != nil {
return nil, err
}
srv.lg.Info("removed base directory", zap.String("dir", srv.Member.BaseDir))
return &rpcpb.Response{
Success: true,
@@ -504,7 +525,7 @@ func (srv *Server) handle_SIGQUIT_ETCD_AND_ARCHIVE_DATA() (*rpcpb.Response, erro
}
srv.lg.Info("archived data", zap.String("base-dir", srv.Member.BaseDir))
if err = srv.saveEtcdLogFile(); err != nil {
if err = srv.createEtcdLogFile(); err != nil {
return nil, err
}
@@ -530,6 +551,9 @@ func (srv *Server) handle_SIGQUIT_ETCD_AND_REMOVE_DATA_AND_STOP_AGENT() (*rpcpb.
}
srv.lg.Info("killed etcd", zap.String("signal", syscall.SIGQUIT.String()))
srv.etcdLogFile.Sync()
srv.etcdLogFile.Close()
err = os.RemoveAll(srv.Member.BaseDir)
if err != nil {
return nil, err

View File

@@ -5,7 +5,7 @@ if ! [[ "$0" =~ "functional/build" ]]; then
exit 255
fi
CGO_ENABLED=0 go build -a -v -installsuffix cgo -ldflags "-s" -o ./bin/etcd-agent ./functional/cmd/etcd-agent
CGO_ENABLED=0 go build -a -v -installsuffix cgo -ldflags "-s" -o ./bin/etcd-proxy ./functional/cmd/etcd-proxy
CGO_ENABLED=0 go build -a -v -installsuffix cgo -ldflags "-s" -o ./bin/etcd-runner ./functional/cmd/etcd-runner
CGO_ENABLED=0 go build -a -v -installsuffix cgo -ldflags "-s" -o ./bin/etcd-tester ./functional/cmd/etcd-tester
CGO_ENABLED=0 go build -v -installsuffix cgo -ldflags "-s" -o ./bin/etcd-agent ./functional/cmd/etcd-agent
CGO_ENABLED=0 go build -v -installsuffix cgo -ldflags "-s" -o ./bin/etcd-proxy ./functional/cmd/etcd-proxy
CGO_ENABLED=0 go build -v -installsuffix cgo -ldflags "-s" -o ./bin/etcd-runner ./functional/cmd/etcd-runner
CGO_ENABLED=0 go build -v -installsuffix cgo -ldflags "-s" -o ./bin/etcd-tester ./functional/cmd/etcd-tester

View File

@@ -158,6 +158,50 @@ const (
// comes back operative as well. As always, after recovery, each member
// must be able to process client requests.
FailureCase_SIGTERM_ALL FailureCase = 5
// SIGQUIT_AND_REMOVE_ONE_FOLLOWER stops a randomly chosen follower
// (non-leader), deletes its data directories on disk, and removes
// this member from cluster (membership reconfiguration). On recovery,
// tester adds a new member, and this member joins the existing cluster
// with fresh data. It waits "failure-delay-ms" before recovering this
// failure. This simulates destroying one follower machine, where operator
// needs to add a new member from a fresh machine.
// The expected behavior is that a new member joins the existing cluster,
// and then each member continues to process client requests.
FailureCase_SIGQUIT_AND_REMOVE_ONE_FOLLOWER FailureCase = 10
// SIGQUIT_AND_REMOVE_ONE_FOLLOWER_UNTIL_TRIGGER_SNAPSHOT stops a randomly
// chosen follower, deletes its data directories on disk, and removes
// this member from cluster (membership reconfiguration). On recovery,
// tester adds a new member, and this member joins the existing cluster
// restart. On member remove, cluster waits until most up-to-date node
// (leader) applies the snapshot count of entries since the stop operation.
// This simulates destroying a leader machine, where operator needs to add
// a new member from a fresh machine.
// The expected behavior is that a new member joins the existing cluster,
// and receives a snapshot from the active leader. As always, after
// recovery, each member must be able to process client requests.
FailureCase_SIGQUIT_AND_REMOVE_ONE_FOLLOWER_UNTIL_TRIGGER_SNAPSHOT FailureCase = 11
// SIGQUIT_AND_REMOVE_LEADER stops the active leader node, deletes its
// data directories on disk, and removes this member from cluster.
// On recovery, tester adds a new member, and this member joins the
// existing cluster with fresh data. It waits "failure-delay-ms" before
// recovering this failure. This simulates destroying a leader machine,
// where operator needs to add a new member from a fresh machine.
// The expected behavior is that a new member joins the existing cluster,
// and then each member continues to process client requests.
FailureCase_SIGQUIT_AND_REMOVE_LEADER FailureCase = 12
// SIGQUIT_AND_REMOVE_LEADER_UNTIL_TRIGGER_SNAPSHOT stops the active leader,
// deletes its data directories on disk, and removes this member from
// cluster (membership reconfiguration). On recovery, tester adds a new
// member, and this member joins the existing cluster restart. On member
// remove, cluster waits until most up-to-date node (new leader) applies
// the snapshot count of entries since the stop operation. This simulates
// destroying a leader machine, where operator needs to add a new member
// from a fresh machine.
// The expected behavior is that on member remove, cluster elects a new
// leader, and a new member joins the existing cluster and receives a
// snapshot from the newly elected leader. As always, after recovery, each
// member must be able to process client requests.
FailureCase_SIGQUIT_AND_REMOVE_LEADER_UNTIL_TRIGGER_SNAPSHOT FailureCase = 13
// BLACKHOLE_PEER_PORT_TX_RX_ONE_FOLLOWER drops all outgoing/incoming
// packets from/to the peer port on a randomly chosen follower
// (non-leader), and waits for "failure-delay-ms" until recovery.
@@ -340,6 +384,10 @@ var FailureCase_name = map[int32]string{
3: "SIGTERM_LEADER_UNTIL_TRIGGER_SNAPSHOT",
4: "SIGTERM_QUORUM",
5: "SIGTERM_ALL",
10: "SIGQUIT_AND_REMOVE_ONE_FOLLOWER",
11: "SIGQUIT_AND_REMOVE_ONE_FOLLOWER_UNTIL_TRIGGER_SNAPSHOT",
12: "SIGQUIT_AND_REMOVE_LEADER",
13: "SIGQUIT_AND_REMOVE_LEADER_UNTIL_TRIGGER_SNAPSHOT",
100: "BLACKHOLE_PEER_PORT_TX_RX_ONE_FOLLOWER",
101: "BLACKHOLE_PEER_PORT_TX_RX_ONE_FOLLOWER_UNTIL_TRIGGER_SNAPSHOT",
102: "BLACKHOLE_PEER_PORT_TX_RX_LEADER",
@@ -370,6 +418,10 @@ var FailureCase_value = map[string]int32{
"SIGTERM_LEADER_UNTIL_TRIGGER_SNAPSHOT": 3,
"SIGTERM_QUORUM": 4,
"SIGTERM_ALL": 5,
"SIGQUIT_AND_REMOVE_ONE_FOLLOWER": 10,
"SIGQUIT_AND_REMOVE_ONE_FOLLOWER_UNTIL_TRIGGER_SNAPSHOT": 11,
"SIGQUIT_AND_REMOVE_LEADER": 12,
"SIGQUIT_AND_REMOVE_LEADER_UNTIL_TRIGGER_SNAPSHOT": 13,
"BLACKHOLE_PEER_PORT_TX_RX_ONE_FOLLOWER": 100,
"BLACKHOLE_PEER_PORT_TX_RX_ONE_FOLLOWER_UNTIL_TRIGGER_SNAPSHOT": 101,
"BLACKHOLE_PEER_PORT_TX_RX_LEADER": 102,
@@ -4162,160 +4214,162 @@ var (
func init() { proto.RegisterFile("rpcpb/rpc.proto", fileDescriptorRpc) }
var fileDescriptorRpc = []byte{
// 2476 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x59, 0x5b, 0x77, 0xdb, 0xc6,
0x11, 0x16, 0x44, 0xcb, 0xb6, 0x56, 0x37, 0x6a, 0x75, 0x31, 0x2c, 0xdb, 0x82, 0x0c, 0xc7, 0xa9,
0xad, 0x14, 0x72, 0x6b, 0xe7, 0xb4, 0xcd, 0xd5, 0x01, 0x29, 0x58, 0x62, 0x05, 0x91, 0xf4, 0x12,
0xb2, 0x93, 0x27, 0x16, 0x22, 0x57, 0x12, 0x6a, 0x0a, 0xa0, 0x81, 0xa5, 0x23, 0xe5, 0x0f, 0xf4,
0xb5, 0xf7, 0xd3, 0xa7, 0xfe, 0x82, 0xa6, 0xbf, 0xc3, 0x4e, 0x6f, 0x69, 0xfb, 0xce, 0xd3, 0x3a,
0xff, 0x80, 0xa7, 0x6d, 0x9a, 0x3e, 0xf5, 0xec, 0x05, 0xe2, 0x02, 0x20, 0x25, 0xbd, 0x09, 0x33,
0xdf, 0xf7, 0xed, 0xec, 0xce, 0xee, 0xcc, 0x48, 0x02, 0x33, 0x61, 0xbb, 0xd1, 0xde, 0xbd, 0x17,
0xb6, 0x1b, 0x6b, 0xed, 0x30, 0x20, 0x01, 0x1c, 0x63, 0x86, 0x25, 0x63, 0xdf, 0x23, 0x07, 0x9d,
0xdd, 0xb5, 0x46, 0x70, 0x78, 0x6f, 0x3f, 0xd8, 0x0f, 0xee, 0x31, 0xef, 0x6e, 0x67, 0x8f, 0x7d,
0xb1, 0x0f, 0xf6, 0x13, 0x67, 0xe9, 0x3f, 0x51, 0xc0, 0x25, 0x84, 0x9f, 0x77, 0x70, 0x44, 0xe0,
0x1a, 0x18, 0xaf, 0xb4, 0x71, 0xe8, 0x12, 0x2f, 0xf0, 0x55, 0x65, 0x45, 0xb9, 0x33, 0x7d, 0x3f,
0xbf, 0xc6, 0x54, 0xd7, 0x4e, 0xec, 0xa8, 0x0f, 0x81, 0xb7, 0xc1, 0xc5, 0x6d, 0x7c, 0xb8, 0x8b,
0x43, 0x75, 0x74, 0x45, 0xb9, 0x33, 0x71, 0x7f, 0x4a, 0x80, 0xb9, 0x11, 0x09, 0x27, 0x85, 0x39,
0x38, 0x22, 0x38, 0x54, 0x73, 0x09, 0x18, 0x37, 0x22, 0xe1, 0xd4, 0x1b, 0xe0, 0x32, 0xc2, 0x51,
0x3b, 0xf0, 0x23, 0x0c, 0x55, 0x70, 0xa9, 0xd6, 0x69, 0x34, 0x70, 0x14, 0xb1, 0x38, 0x2e, 0xa3,
0xf8, 0x13, 0x2e, 0x82, 0x8b, 0x35, 0xe2, 0x92, 0x4e, 0xc4, 0xd6, 0x1c, 0x47, 0xe2, 0x4b, 0x8a,
0x25, 0x77, 0x4a, 0x2c, 0xfa, 0x6f, 0x27, 0x62, 0x1c, 0xfc, 0x00, 0x4c, 0x5a, 0xa4, 0xd1, 0xb4,
0x8e, 0x70, 0xa3, 0xea, 0x92, 0x03, 0xb6, 0xd0, 0x78, 0xe1, 0x6a, 0xaf, 0xab, 0x2d, 0x1c, 0xbb,
0x87, 0xad, 0x77, 0x75, 0x4c, 0x1a, 0x4d, 0x03, 0x1f, 0xe1, 0x86, 0xd1, 0x76, 0xc9, 0x81, 0x8e,
0x12, 0x70, 0xf8, 0x00, 0x8c, 0x9b, 0xfb, 0xd8, 0x27, 0x66, 0xb3, 0x19, 0xaa, 0x13, 0x8c, 0xbb,
0xd0, 0xeb, 0x6a, 0xb3, 0x9c, 0xeb, 0x52, 0x97, 0xe1, 0x36, 0x9b, 0xa1, 0x8e, 0xfa, 0x38, 0x68,
0x83, 0xd9, 0x47, 0xae, 0xd7, 0x6a, 0x07, 0x9e, 0x4f, 0x36, 0x1d, 0xa7, 0xca, 0xc8, 0x93, 0x8c,
0xbc, 0xdc, 0xeb, 0x6a, 0x4b, 0x9c, 0xbc, 0x17, 0x43, 0x8c, 0x03, 0x42, 0xda, 0x42, 0x25, 0x4b,
0x84, 0x06, 0xb8, 0x54, 0x70, 0x23, 0xbc, 0xee, 0x85, 0x2a, 0x66, 0x1a, 0x73, 0xbd, 0xae, 0x36,
0xc3, 0x35, 0x76, 0xdd, 0x08, 0x1b, 0x4d, 0x2f, 0xd4, 0x51, 0x8c, 0x81, 0xef, 0x82, 0x09, 0xba,
0x03, 0x3b, 0xd8, 0x67, 0xfb, 0xdd, 0x63, 0x14, 0xb5, 0xd7, 0xd5, 0xe6, 0xa5, 0xfd, 0xb6, 0x82,
0x7d, 0xb1, 0x5d, 0x19, 0x0c, 0x37, 0xc0, 0x0c, 0xfd, 0x2c, 0xb6, 0x3c, 0xec, 0x93, 0x6a, 0x18,
0x1c, 0x1d, 0xab, 0xaf, 0x58, 0x66, 0x0a, 0xd7, 0x7b, 0x5d, 0x4d, 0x95, 0x04, 0x1a, 0x0c, 0x62,
0xb4, 0x29, 0x46, 0x47, 0x69, 0x16, 0x34, 0xc1, 0x14, 0x35, 0x55, 0x31, 0x0e, 0xb9, 0xcc, 0x17,
0x5c, 0x66, 0xa9, 0xd7, 0xd5, 0x16, 0x25, 0x99, 0x36, 0xc6, 0x61, 0x2c, 0x92, 0x64, 0xc0, 0x2a,
0x80, 0x7d, 0x55, 0xcb, 0x6f, 0xb2, 0x43, 0x51, 0x3f, 0x67, 0xf7, 0xa1, 0xa0, 0xf5, 0xba, 0xda,
0xb5, 0x6c, 0x38, 0x58, 0xc0, 0x74, 0x34, 0x80, 0x0b, 0xbf, 0x0b, 0x2e, 0x50, 0xab, 0xfa, 0x7b,
0x7e, 0x8f, 0x27, 0xc4, 0xdd, 0xa1, 0xb6, 0xc2, 0x4c, 0xaf, 0xab, 0x4d, 0xf4, 0x05, 0x75, 0xc4,
0xa0, 0x70, 0x1d, 0x4c, 0x73, 0x91, 0x22, 0x0e, 0xc9, 0xba, 0x4b, 0x5c, 0xf5, 0x67, 0x39, 0x16,
0xc0, 0xb5, 0x5e, 0x57, 0xbb, 0xc2, 0xf1, 0x62, 0xed, 0x06, 0x0e, 0x89, 0xd1, 0x74, 0x89, 0xab,
0xa3, 0x14, 0x27, 0xa9, 0xc2, 0xb2, 0xf2, 0xf3, 0x53, 0x55, 0x78, 0x66, 0x52, 0x1c, 0x7a, 0xa6,
0xdc, 0xb2, 0x85, 0x8f, 0x59, 0x28, 0xbf, 0xe0, 0x22, 0xd2, 0x99, 0x0a, 0x91, 0x67, 0xf8, 0x58,
0x44, 0x92, 0x64, 0x24, 0x24, 0x58, 0x1c, 0xbf, 0x3c, 0x4d, 0x82, 0x87, 0x91, 0x64, 0x40, 0x07,
0xcc, 0x71, 0x83, 0x13, 0x76, 0x22, 0x82, 0x9b, 0x45, 0x93, 0xc5, 0xf2, 0x2b, 0x2e, 0x74, 0xb3,
0xd7, 0xd5, 0x6e, 0x24, 0x84, 0x08, 0x87, 0x19, 0x0d, 0x57, 0x84, 0x34, 0x88, 0x3e, 0x40, 0x95,
0x85, 0xf7, 0xeb, 0x73, 0xa8, 0xf2, 0x28, 0x07, 0xd1, 0xe1, 0x87, 0x60, 0x92, 0xde, 0xa7, 0x93,
0xdc, 0xfd, 0x3b, 0x97, 0x7e, 0xfc, 0xec, 0xfe, 0x49, 0x99, 0x4b, 0xe0, 0x65, 0x3e, 0x0b, 0xe7,
0x3f, 0xa7, 0xf0, 0x45, 0xf1, 0x90, 0xf1, 0xf0, 0x3d, 0x30, 0x41, 0xbf, 0xe3, 0x7c, 0x7d, 0x9d,
0x4b, 0xbf, 0x45, 0x46, 0xef, 0x67, 0x4b, 0x46, 0x4b, 0x64, 0xb6, 0xf6, 0x7f, 0x87, 0x93, 0xc5,
0x43, 0x96, 0xd0, 0xb0, 0x0c, 0x66, 0xe9, 0x67, 0x32, 0x47, 0xdf, 0xe4, 0xd2, 0x6f, 0x87, 0x49,
0x64, 0x32, 0x94, 0xa5, 0x66, 0xf4, 0x58, 0x48, 0xff, 0x3b, 0x53, 0x8f, 0x47, 0x96, 0xa5, 0xea,
0x5f, 0x4d, 0xc6, 0xdd, 0x82, 0x96, 0x37, 0xba, 0x04, 0x2d, 0x6f, 0x4a, 0xba, 0xbc, 0xd1, 0x78,
0x44, 0x79, 0x13, 0x18, 0xf8, 0x6d, 0x70, 0xa9, 0x8c, 0xc9, 0xa7, 0x41, 0xf8, 0x8c, 0xb7, 0x86,
0x02, 0xec, 0x75, 0xb5, 0x69, 0x0e, 0xf7, 0xb9, 0x43, 0x47, 0x31, 0x04, 0xde, 0x02, 0x17, 0x58,
0xf1, 0xe5, 0x91, 0x4a, 0x8f, 0x9c, 0x57, 0x5b, 0xe6, 0x84, 0x45, 0x30, 0xbd, 0x8e, 0x5b, 0xee,
0xb1, 0xed, 0x12, 0xec, 0x37, 0x8e, 0xb7, 0x23, 0x56, 0xe8, 0xa7, 0xe4, 0xd7, 0xd9, 0xa4, 0x7e,
0xa3, 0xc5, 0x01, 0xc6, 0x61, 0xa4, 0xa3, 0x14, 0x05, 0xfe, 0x10, 0xe4, 0x93, 0x16, 0xf4, 0x82,
0x95, 0xfc, 0x29, 0xb9, 0xe4, 0xa7, 0x65, 0x8c, 0xf0, 0x85, 0x8e, 0x32, 0x3c, 0xf8, 0x09, 0x58,
0xd8, 0x69, 0x37, 0x5d, 0x82, 0x9b, 0xa9, 0xb8, 0xa6, 0x98, 0xe0, 0xad, 0x5e, 0x57, 0xd3, 0xb8,
0x60, 0x87, 0xc3, 0x8c, 0x6c, 0x7c, 0x83, 0x15, 0xe0, 0xf7, 0x00, 0x40, 0x41, 0xc7, 0x6f, 0xda,
0xde, 0xa1, 0x47, 0xd4, 0x85, 0x15, 0xe5, 0xce, 0x58, 0x61, 0xb1, 0xd7, 0xd5, 0x20, 0xd7, 0x0b,
0xa9, 0xcf, 0x68, 0x51, 0xa7, 0x8e, 0x24, 0x24, 0xfc, 0x08, 0x4c, 0x59, 0x47, 0x1e, 0xa9, 0xf8,
0xb4, 0x3f, 0x75, 0x42, 0xac, 0x2e, 0x66, 0xea, 0xf9, 0x91, 0x47, 0x8c, 0xc0, 0x37, 0xf6, 0x38,
0x80, 0xd6, 0x73, 0x99, 0x00, 0x37, 0x41, 0xbe, 0x18, 0xf8, 0x91, 0x17, 0xb1, 0x50, 0x8a, 0x07,
0xb8, 0xf1, 0x4c, 0xbd, 0x92, 0xee, 0x2d, 0x8d, 0x3e, 0xc2, 0x68, 0x50, 0x88, 0x8e, 0x32, 0x2c,
0xf8, 0x0e, 0x98, 0xb0, 0x7c, 0x77, 0xb7, 0x85, 0xab, 0xed, 0x30, 0xd8, 0x53, 0x55, 0x26, 0x72,
0xa5, 0xd7, 0xd5, 0xe6, 0x44, 0x24, 0xcc, 0x69, 0xb4, 0xa9, 0x97, 0x36, 0xb8, 0x3e, 0x96, 0xa6,
0x5a, 0xc4, 0xc3, 0xce, 0x65, 0x3b, 0x52, 0xb5, 0x74, 0xaa, 0x45, 0xfc, 0xe2, 0x48, 0x59, 0xaa,
0x93, 0x14, 0x58, 0x38, 0x11, 0xa9, 0x1d, 0x74, 0xf6, 0xf6, 0x5a, 0x58, 0x5d, 0x49, 0x1f, 0x46,
0x2c, 0x12, 0x71, 0x40, 0x5f, 0x43, 0x30, 0xe0, 0xfb, 0x60, 0x52, 0x58, 0x8a, 0x6e, 0x84, 0x23,
0xf5, 0xe6, 0x4a, 0x2e, 0xf9, 0xba, 0x63, 0x85, 0x06, 0x75, 0xeb, 0x28, 0x81, 0x86, 0x5b, 0xd2,
0x80, 0x51, 0x0c, 0x0e, 0x0f, 0x5d, 0xbf, 0x19, 0xa9, 0x3a, 0x93, 0xb8, 0xd1, 0xeb, 0x6a, 0x57,
0xd3, 0x03, 0x46, 0x43, 0x60, 0xe4, 0xf9, 0x22, 0xe6, 0xd1, 0x33, 0x41, 0x1d, 0xdf, 0xc7, 0xe1,
0xc9, 0x8c, 0x74, 0x37, 0xdd, 0x9c, 0x42, 0xe6, 0x97, 0xa7, 0xa4, 0x14, 0x05, 0x96, 0x40, 0xde,
0x3a, 0x22, 0x38, 0xf4, 0xdd, 0xd6, 0x89, 0xcc, 0x2a, 0x93, 0x91, 0x02, 0xc2, 0x02, 0x21, 0x0b,
0x65, 0x68, 0x34, 0xbd, 0x35, 0x12, 0xe2, 0x28, 0x72, 0x8e, 0xdb, 0x38, 0x52, 0x31, 0xdb, 0x96,
0x94, 0xde, 0x88, 0x39, 0x0d, 0x42, 0xbd, 0x3a, 0x92, 0xb1, 0xf4, 0x96, 0xf2, 0xcf, 0x2d, 0x7c,
0x5c, 0xf3, 0x3e, 0xc3, 0x6c, 0xfa, 0x19, 0x93, 0x13, 0x23, 0xc8, 0xb4, 0x6c, 0x46, 0xde, 0x67,
0xf4, 0x96, 0x26, 0x08, 0x74, 0xea, 0x48, 0x18, 0x6c, 0x37, 0xdc, 0xc7, 0xea, 0x3e, 0x93, 0x59,
0xe9, 0x75, 0xb5, 0xeb, 0x03, 0x65, 0x8c, 0x16, 0x85, 0xe9, 0x68, 0x00, 0x17, 0x3e, 0x01, 0xf3,
0x7d, 0x6b, 0x67, 0x6f, 0xcf, 0x3b, 0x42, 0xae, 0xbf, 0x8f, 0xd5, 0x03, 0xa6, 0xa9, 0xf7, 0xba,
0xda, 0x72, 0x56, 0x93, 0xe1, 0x8c, 0x90, 0x02, 0x75, 0x34, 0x90, 0x0f, 0x7f, 0x04, 0xae, 0x0c,
0xb2, 0x3b, 0x47, 0xbe, 0xea, 0x31, 0xe9, 0x37, 0x7b, 0x5d, 0x4d, 0x3f, 0x55, 0xda, 0x20, 0x47,
0xbe, 0x8e, 0x86, 0xc9, 0xd0, 0x69, 0xf0, 0xc4, 0xe5, 0x1c, 0xf9, 0x95, 0x76, 0xa4, 0xfe, 0x98,
0x29, 0x4b, 0x29, 0x95, 0x94, 0xc9, 0x91, 0x6f, 0x04, 0xed, 0x48, 0x47, 0x69, 0x56, 0x3f, 0x2d,
0xbc, 0x49, 0x47, 0x7c, 0xa8, 0x1c, 0x93, 0x1b, 0xa9, 0xd0, 0xe1, 0xed, 0x3d, 0x3a, 0x49, 0x8b,
0x20, 0xc0, 0xb7, 0xc1, 0x38, 0x37, 0x3c, 0xae, 0xd6, 0xf8, 0x2c, 0x39, 0x26, 0xcf, 0xe1, 0x82,
0xfd, 0x9c, 0xae, 0xde, 0x07, 0xea, 0xdf, 0x4c, 0xf1, 0x89, 0x8f, 0xb6, 0x81, 0xb2, 0x7b, 0x88,
0x45, 0x83, 0x91, 0xda, 0x80, 0xef, 0x1e, 0x62, 0x1d, 0x31, 0xa7, 0xdc, 0x88, 0x46, 0xcf, 0xd1,
0x88, 0x56, 0xc1, 0xc5, 0xa7, 0xa6, 0x4d, 0xd1, 0xb9, 0x74, 0x1f, 0xfa, 0xd4, 0x6d, 0x71, 0xb0,
0x40, 0xc0, 0x0a, 0x98, 0xdb, 0xc4, 0x6e, 0x48, 0x76, 0xb1, 0x4b, 0x4a, 0x3e, 0xc1, 0xe1, 0x0b,
0xb7, 0x25, 0xda, 0x4c, 0x4e, 0x3e, 0xcd, 0x83, 0x18, 0x64, 0x78, 0x02, 0xa5, 0xa3, 0x41, 0x4c,
0x58, 0x02, 0xb3, 0x56, 0x0b, 0x37, 0xe8, 0xef, 0x67, 0x8e, 0x77, 0x88, 0x83, 0x0e, 0xd9, 0x8e,
0x58, 0xbb, 0xc9, 0xc9, 0xcf, 0x16, 0x0b, 0x88, 0x41, 0x38, 0x46, 0x47, 0x59, 0x16, 0x7d, 0xb9,
0x36, 0x2b, 0xaf, 0xfc, 0xac, 0x77, 0x90, 0x1d, 0xa9, 0x0b, 0xe9, 0x52, 0xd2, 0x62, 0x88, 0x78,
0xcc, 0xee, 0x84, 0xad, 0x48, 0x47, 0x19, 0x1a, 0x44, 0x60, 0xce, 0x6c, 0xbe, 0xc0, 0x21, 0xf1,
0x22, 0x2c, 0xa9, 0x2d, 0x32, 0x35, 0xe9, 0xf5, 0xb8, 0x31, 0x28, 0x29, 0x38, 0x88, 0x0c, 0xdf,
0x89, 0x47, 0x56, 0xb3, 0x43, 0x02, 0xc7, 0xae, 0x89, 0x9e, 0x21, 0xe5, 0xc6, 0xed, 0x90, 0xc0,
0x20, 0x54, 0x20, 0x89, 0xa4, 0x85, 0xad, 0x3f, 0x42, 0x9b, 0x1d, 0x72, 0x20, 0x5a, 0xc5, 0x90,
0xa9, 0xdb, 0xed, 0xa4, 0xa6, 0x6e, 0x4a, 0x81, 0xef, 0xcb, 0x22, 0x8f, 0xbc, 0x16, 0x56, 0xaf,
0xb2, 0x74, 0xcf, 0xf7, 0xba, 0x5a, 0x5e, 0x88, 0x50, 0xf6, 0x9e, 0xc7, 0xca, 0x7c, 0x12, 0xdb,
0x8f, 0x7e, 0x0b, 0x1f, 0x33, 0xf2, 0x52, 0xfa, 0x66, 0xd1, 0x97, 0xc3, 0xb9, 0x49, 0x24, 0xb4,
0x33, 0x23, 0x31, 0x13, 0xb8, 0x96, 0x1e, 0xd8, 0xa5, 0x71, 0x8b, 0xeb, 0x0c, 0xa2, 0xd1, 0xb3,
0xe0, 0xe9, 0xa2, 0xb3, 0x18, 0xcb, 0x8a, 0xc6, 0xb2, 0x22, 0x9d, 0x85, 0xc8, 0x31, 0x9b, 0xe1,
0x78, 0x42, 0x52, 0x14, 0xe8, 0x80, 0xd9, 0x93, 0x14, 0x9d, 0xe8, 0xac, 0x30, 0x1d, 0xa9, 0xd8,
0x78, 0xbe, 0x47, 0x3c, 0xb7, 0x65, 0xf4, 0xb3, 0x2c, 0x49, 0x66, 0x05, 0xe8, 0x2f, 0xac, 0xf4,
0xe7, 0x38, 0xbf, 0x37, 0x59, 0x8e, 0xd2, 0x73, 0x6e, 0x3f, 0xc9, 0x32, 0x98, 0x96, 0x6b, 0x36,
0x71, 0x27, 0xd3, 0xac, 0x33, 0x09, 0xe9, 0xc2, 0xf1, 0x31, 0x3d, 0x93, 0xeb, 0x01, 0x5c, 0xf8,
0x41, 0x7f, 0xe6, 0x67, 0xe7, 0x7d, 0x6b, 0xf8, 0xc8, 0xcf, 0x8f, 0x3b, 0x01, 0x8f, 0x37, 0x13,
0xa7, 0xfb, 0x8d, 0xa1, 0x43, 0x3b, 0x27, 0xcb, 0x60, 0xb8, 0x9d, 0x1a, 0xb2, 0x99, 0xc2, 0xed,
0xb3, 0x66, 0x6c, 0x2e, 0x94, 0x65, 0xd2, 0x31, 0xa5, 0xc4, 0x53, 0x51, 0x6c, 0x75, 0xd8, 0x1f,
0x66, 0xee, 0xa6, 0xef, 0x4e, 0x9c, 0xaa, 0x06, 0x07, 0xe8, 0x28, 0xc5, 0xa0, 0x2f, 0x3a, 0x69,
0xa9, 0x11, 0x97, 0x60, 0xd1, 0xd9, 0xa5, 0x03, 0x4e, 0x09, 0x19, 0x11, 0x85, 0xe9, 0x68, 0x10,
0x39, 0xab, 0xe9, 0x04, 0xcf, 0xb0, 0xaf, 0xbe, 0x75, 0x96, 0x26, 0xa1, 0xb0, 0x8c, 0x26, 0x23,
0xc3, 0x87, 0x60, 0xaa, 0xe6, 0xbb, 0xed, 0xe8, 0x20, 0x20, 0xc5, 0xa0, 0xe3, 0x13, 0xf5, 0x01,
0xab, 0x85, 0x72, 0x83, 0x11, 0x6e, 0xa3, 0x41, 0xfd, 0xb4, 0xc1, 0xc8, 0x78, 0x68, 0x83, 0xd9,
0xc7, 0x9d, 0x80, 0xb8, 0x05, 0xb7, 0xf1, 0x0c, 0xfb, 0xcd, 0xc2, 0x31, 0xc1, 0x91, 0xfa, 0x36,
0x13, 0x91, 0xe6, 0xf7, 0xe7, 0x14, 0x62, 0xec, 0x72, 0x8c, 0xb1, 0x4b, 0x41, 0x3a, 0xca, 0x12,
0x69, 0x2b, 0xa9, 0x86, 0xf8, 0x49, 0x40, 0xb0, 0xfa, 0x30, 0x5d, 0xae, 0xda, 0x21, 0x36, 0x5e,
0x04, 0xf4, 0x74, 0x62, 0x8c, 0x7c, 0x22, 0x41, 0x18, 0x76, 0xda, 0x84, 0x4f, 0xc7, 0x1f, 0xa5,
0xaf, 0xf1, 0xc9, 0x89, 0x70, 0x54, 0x3c, 0x21, 0x0f, 0x22, 0xaf, 0xbe, 0x1c, 0x95, 0xfe, 0xcc,
0x07, 0x67, 0xc0, 0x44, 0xb9, 0xe2, 0xd4, 0x6b, 0x8e, 0x89, 0x1c, 0x6b, 0x3d, 0x3f, 0x02, 0x17,
0x01, 0x2c, 0x95, 0x4b, 0x4e, 0xc9, 0xb4, 0xb9, 0xb1, 0x6e, 0x39, 0xc5, 0xf5, 0x3c, 0x80, 0x79,
0x30, 0x89, 0x2c, 0xc9, 0x32, 0x41, 0x2d, 0xb5, 0xd2, 0x86, 0x63, 0xa1, 0x6d, 0x6e, 0x99, 0x87,
0x2b, 0xe0, 0x7a, 0xad, 0xb4, 0xf1, 0x78, 0xa7, 0xc4, 0x31, 0x75, 0xb3, 0xbc, 0x5e, 0x47, 0xd6,
0x76, 0xe5, 0x89, 0x55, 0x5f, 0x37, 0x1d, 0x33, 0xbf, 0x00, 0x6f, 0x82, 0x1b, 0x19, 0x84, 0x89,
0x8a, 0x9b, 0xa5, 0x18, 0xb2, 0x0c, 0xef, 0x81, 0xb7, 0x4e, 0x13, 0x61, 0xdf, 0x35, 0xa7, 0x52,
0xad, 0x9b, 0x1b, 0x56, 0xd9, 0xc9, 0x6b, 0xf0, 0x06, 0xb8, 0x5a, 0xb0, 0xcd, 0xe2, 0xd6, 0x66,
0xc5, 0xb6, 0xea, 0x55, 0xcb, 0x42, 0xf5, 0x6a, 0x05, 0x39, 0x75, 0xe7, 0xe3, 0x3a, 0xfa, 0x38,
0xdf, 0x84, 0x1a, 0xb8, 0xb6, 0x53, 0x1e, 0x0e, 0xc0, 0x70, 0x09, 0x2c, 0xac, 0x5b, 0xb6, 0xf9,
0x49, 0xc6, 0xf5, 0x52, 0x81, 0xd7, 0xc1, 0x95, 0x9d, 0xf2, 0x60, 0xef, 0x2b, 0x65, 0xf5, 0xeb,
0xcb, 0x60, 0x42, 0x1a, 0xbf, 0xa1, 0x0a, 0xe6, 0xe3, 0x13, 0xa9, 0x94, 0xad, 0xfa, 0xa3, 0x8a,
0x6d, 0x57, 0x9e, 0x5a, 0x28, 0x3f, 0x22, 0x36, 0x95, 0xf1, 0xd4, 0x77, 0xca, 0x4e, 0xc9, 0xae,
0x3b, 0xa8, 0xb4, 0xb1, 0x61, 0xa1, 0x7a, 0xad, 0x6c, 0x56, 0x6b, 0x9b, 0x15, 0x27, 0xaf, 0x40,
0x08, 0xa6, 0x63, 0x82, 0x6d, 0x99, 0xeb, 0x16, 0xca, 0x8f, 0xc2, 0xbb, 0xe0, 0x76, 0xd2, 0x36,
0x8c, 0x9e, 0x93, 0xe9, 0x8f, 0x77, 0x2a, 0x68, 0x67, 0x3b, 0x7f, 0x81, 0xa6, 0x3a, 0xb6, 0x99,
0xb6, 0x9d, 0x1f, 0x83, 0xab, 0xe0, 0xcd, 0xa1, 0xe7, 0x92, 0xdc, 0x40, 0x13, 0x9a, 0xe0, 0x83,
0xf3, 0x61, 0x87, 0xc5, 0x84, 0xe1, 0x1b, 0x60, 0x65, 0xb8, 0x84, 0xd8, 0xe4, 0x1e, 0x7c, 0x0f,
0x7c, 0xff, 0x2c, 0xd4, 0xb0, 0x25, 0xf6, 0x4f, 0x5f, 0x42, 0x1c, 0xc4, 0x01, 0xbd, 0x84, 0xc3,
0x51, 0xf4, 0x68, 0x3c, 0xf8, 0x2d, 0xa0, 0x0f, 0xcc, 0x7a, 0xf2, 0x58, 0x5e, 0x2a, 0x70, 0x0d,
0xdc, 0x45, 0x66, 0x79, 0xbd, 0xb2, 0x5d, 0x3f, 0x07, 0xfe, 0x95, 0x02, 0x3f, 0x04, 0xef, 0x9c,
0x0d, 0x1c, 0xb6, 0xc1, 0x2f, 0x14, 0x68, 0x81, 0x8f, 0xce, 0xbd, 0xde, 0x30, 0x99, 0x3f, 0x28,
0xf0, 0x26, 0xb8, 0x3e, 0x98, 0x2f, 0xf2, 0xf0, 0x47, 0x05, 0xde, 0x01, 0xb7, 0x4e, 0x5d, 0x49,
0x20, 0xff, 0xa4, 0xc0, 0x1f, 0x80, 0x07, 0xa7, 0x41, 0x86, 0x85, 0xf1, 0x67, 0x05, 0x3e, 0x04,
0xef, 0x9e, 0x63, 0x8d, 0x61, 0x02, 0x7f, 0x39, 0x65, 0x1f, 0x22, 0xd9, 0x5f, 0x9e, 0xbd, 0x0f,
0x81, 0xfc, 0xab, 0x02, 0x97, 0xc1, 0xd5, 0xc1, 0x10, 0x7a, 0x27, 0xfe, 0xa6, 0xc0, 0xdb, 0x60,
0xe5, 0x54, 0x25, 0x0a, 0xfb, 0xbb, 0x02, 0x55, 0x30, 0x57, 0xae, 0xd4, 0x1f, 0x99, 0x25, 0xbb,
0xfe, 0xb4, 0xe4, 0x6c, 0xd6, 0x6b, 0x0e, 0xb2, 0x6a, 0xb5, 0xfc, 0xef, 0x46, 0x69, 0x28, 0x09,
0x4f, 0xb9, 0x22, 0x9c, 0xf5, 0x47, 0x15, 0x54, 0xb7, 0x4b, 0x4f, 0xac, 0x32, 0x45, 0x7e, 0x3e,
0x0a, 0x67, 0x00, 0xa0, 0xb0, 0x6a, 0xa5, 0x54, 0x76, 0x6a, 0xf9, 0x9f, 0xe6, 0xe0, 0x14, 0xb8,
0x6c, 0x7d, 0xec, 0x58, 0xa8, 0x6c, 0xda, 0xf9, 0x7f, 0xe5, 0x56, 0x03, 0x00, 0xfa, 0xbf, 0xde,
0xc2, 0x8b, 0x60, 0x74, 0xeb, 0x49, 0x7e, 0x04, 0x8e, 0x83, 0x31, 0xdb, 0x32, 0x6b, 0x56, 0x5e,
0x81, 0x73, 0x60, 0xc6, 0xb2, 0xad, 0xa2, 0x53, 0xaa, 0x94, 0xeb, 0x68, 0xa7, 0x5c, 0x66, 0x05,
0x24, 0x0f, 0x26, 0x9f, 0x9a, 0x4e, 0x71, 0x33, 0xb6, 0xe4, 0xe0, 0x02, 0x98, 0xb5, 0x2b, 0xc5,
0xad, 0x3a, 0x32, 0x8b, 0x16, 0x8a, 0xcd, 0x17, 0x28, 0x90, 0x09, 0xc5, 0x96, 0xb1, 0xfb, 0x0f,
0xc1, 0xb8, 0x13, 0xba, 0x7e, 0xd4, 0x0e, 0x42, 0x02, 0xef, 0xcb, 0x1f, 0xd3, 0xe2, 0xaf, 0xe5,
0xe2, 0xbf, 0x48, 0x4b, 0x33, 0x27, 0xdf, 0xfc, 0x9f, 0x39, 0xfa, 0xc8, 0x1d, 0xe5, 0x3b, 0x4a,
0x61, 0xfe, 0xe5, 0x3f, 0x97, 0x47, 0x5e, 0xbe, 0x5e, 0x56, 0xbe, 0x7c, 0xbd, 0xac, 0xfc, 0xe3,
0xf5, 0xb2, 0xf2, 0x9b, 0xaf, 0x96, 0x47, 0x76, 0x2f, 0xb2, 0xff, 0x42, 0x3d, 0xf8, 0x7f, 0x00,
0x00, 0x00, 0xff, 0xff, 0x93, 0xbf, 0x7b, 0xa5, 0xce, 0x1a, 0x00, 0x00,
// 2512 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x59, 0xdb, 0x76, 0xdb, 0xc6,
0xd5, 0x36, 0x44, 0xcb, 0x8e, 0x86, 0x3a, 0x50, 0xa3, 0x83, 0x61, 0xd9, 0x16, 0x64, 0x38, 0xce,
0x6f, 0x2b, 0x3f, 0xe4, 0xd4, 0xce, 0x4a, 0x1b, 0xe7, 0xe0, 0x80, 0x14, 0x2c, 0xb1, 0x82, 0x48,
0x7a, 0x08, 0xd9, 0xc9, 0x15, 0x0b, 0x91, 0x23, 0x09, 0x35, 0x05, 0x30, 0xc0, 0xd0, 0x91, 0xf2,
0x02, 0xbd, 0xed, 0x79, 0xf5, 0xaa, 0x4f, 0xd0, 0xf4, 0x39, 0x9c, 0xf4, 0x94, 0xb6, 0xf7, 0x5c,
0xad, 0xf3, 0x06, 0x5c, 0x3d, 0xa5, 0x57, 0x5d, 0x73, 0x80, 0x38, 0x00, 0x48, 0x49, 0x77, 0xc2,
0xde, 0xdf, 0xf7, 0xcd, 0x9e, 0xd9, 0x33, 0x7b, 0x6f, 0x49, 0x60, 0x26, 0xec, 0x34, 0x3b, 0xbb,
0xf7, 0xc2, 0x4e, 0x73, 0xad, 0x13, 0x06, 0x24, 0x80, 0xe3, 0xcc, 0xb0, 0x64, 0xec, 0x7b, 0xe4,
0xa0, 0xbb, 0xbb, 0xd6, 0x0c, 0x0e, 0xef, 0xed, 0x07, 0xfb, 0xc1, 0x3d, 0xe6, 0xdd, 0xed, 0xee,
0xb1, 0x2f, 0xf6, 0xc1, 0x7e, 0xe2, 0x2c, 0xfd, 0x47, 0x0a, 0xb8, 0x8c, 0xf0, 0xa7, 0x5d, 0x1c,
0x11, 0xb8, 0x06, 0x26, 0xaa, 0x1d, 0x1c, 0xba, 0xc4, 0x0b, 0x7c, 0x55, 0x59, 0x51, 0xee, 0x4c,
0xdf, 0x2f, 0xac, 0x31, 0xd5, 0xb5, 0x13, 0x3b, 0x1a, 0x40, 0xe0, 0x6d, 0x70, 0x69, 0x1b, 0x1f,
0xee, 0xe2, 0x50, 0x1d, 0x5b, 0x51, 0xee, 0xe4, 0xef, 0x4f, 0x09, 0x30, 0x37, 0x22, 0xe1, 0xa4,
0x30, 0x07, 0x47, 0x04, 0x87, 0x6a, 0x2e, 0x01, 0xe3, 0x46, 0x24, 0x9c, 0x7a, 0x13, 0xbc, 0x86,
0x70, 0xd4, 0x09, 0xfc, 0x08, 0x43, 0x15, 0x5c, 0xae, 0x77, 0x9b, 0x4d, 0x1c, 0x45, 0x2c, 0x8e,
0xd7, 0x50, 0xfc, 0x09, 0x17, 0xc1, 0xa5, 0x3a, 0x71, 0x49, 0x37, 0x62, 0x6b, 0x4e, 0x20, 0xf1,
0x25, 0xc5, 0x92, 0x3b, 0x25, 0x16, 0xfd, 0xd7, 0xf9, 0x18, 0x07, 0x3f, 0x00, 0x93, 0x16, 0x69,
0xb6, 0xac, 0x23, 0xdc, 0xac, 0xb9, 0xe4, 0x80, 0x2d, 0x34, 0x51, 0xbc, 0xda, 0xef, 0x69, 0x0b,
0xc7, 0xee, 0x61, 0xfb, 0xa1, 0x8e, 0x49, 0xb3, 0x65, 0xe0, 0x23, 0xdc, 0x34, 0x3a, 0x2e, 0x39,
0xd0, 0x51, 0x02, 0x0e, 0x1f, 0x80, 0x09, 0x73, 0x1f, 0xfb, 0xc4, 0x6c, 0xb5, 0x42, 0x35, 0xcf,
0xb8, 0x0b, 0xfd, 0x9e, 0x36, 0xcb, 0xb9, 0x2e, 0x75, 0x19, 0x6e, 0xab, 0x15, 0xea, 0x68, 0x80,
0x83, 0x36, 0x98, 0x7d, 0xec, 0x7a, 0xed, 0x4e, 0xe0, 0xf9, 0x64, 0xd3, 0x71, 0x6a, 0x8c, 0x3c,
0xc9, 0xc8, 0xcb, 0xfd, 0x9e, 0xb6, 0xc4, 0xc9, 0x7b, 0x31, 0xc4, 0x38, 0x20, 0xa4, 0x23, 0x54,
0xb2, 0x44, 0x68, 0x80, 0xcb, 0x45, 0x37, 0xc2, 0xeb, 0x5e, 0xa8, 0x62, 0xa6, 0x31, 0xd7, 0xef,
0x69, 0x33, 0x5c, 0x63, 0xd7, 0x8d, 0xb0, 0xd1, 0xf2, 0x42, 0x1d, 0xc5, 0x18, 0xf8, 0x10, 0xe4,
0xe9, 0x0e, 0xec, 0x60, 0x9f, 0xed, 0x77, 0x8f, 0x51, 0xd4, 0x7e, 0x4f, 0x9b, 0x97, 0xf6, 0xdb,
0x0e, 0xf6, 0xc5, 0x76, 0x65, 0x30, 0xdc, 0x00, 0x33, 0xf4, 0xb3, 0xd4, 0xf6, 0xb0, 0x4f, 0x6a,
0x61, 0x70, 0x74, 0xac, 0x7e, 0xc9, 0x32, 0x53, 0xbc, 0xde, 0xef, 0x69, 0xaa, 0x24, 0xd0, 0x64,
0x10, 0xa3, 0x43, 0x31, 0x3a, 0x4a, 0xb3, 0xa0, 0x09, 0xa6, 0xa8, 0xa9, 0x86, 0x71, 0xc8, 0x65,
0xbe, 0xe2, 0x32, 0x4b, 0xfd, 0x9e, 0xb6, 0x28, 0xc9, 0x74, 0x30, 0x0e, 0x63, 0x91, 0x24, 0x03,
0xd6, 0x00, 0x1c, 0xa8, 0x5a, 0x7e, 0x8b, 0x1d, 0x8a, 0xfa, 0x05, 0xbb, 0x0f, 0x45, 0xad, 0xdf,
0xd3, 0xae, 0x65, 0xc3, 0xc1, 0x02, 0xa6, 0xa3, 0x21, 0x5c, 0xf8, 0x1d, 0x70, 0x91, 0x5a, 0xd5,
0xdf, 0xf2, 0x7b, 0x9c, 0x17, 0x77, 0x87, 0xda, 0x8a, 0x33, 0xfd, 0x9e, 0x96, 0x1f, 0x08, 0xea,
0x88, 0x41, 0xe1, 0x3a, 0x98, 0xe6, 0x22, 0x25, 0x1c, 0x92, 0x75, 0x97, 0xb8, 0xea, 0x4f, 0x72,
0x2c, 0x80, 0x6b, 0xfd, 0x9e, 0x76, 0x85, 0xe3, 0xc5, 0xda, 0x4d, 0x1c, 0x12, 0xa3, 0xe5, 0x12,
0x57, 0x47, 0x29, 0x4e, 0x52, 0x85, 0x65, 0xe5, 0xa7, 0xa7, 0xaa, 0xf0, 0xcc, 0xa4, 0x38, 0xf4,
0x4c, 0xb9, 0x65, 0x0b, 0x1f, 0xb3, 0x50, 0x7e, 0xc6, 0x45, 0xa4, 0x33, 0x15, 0x22, 0xcf, 0xf1,
0xb1, 0x88, 0x24, 0xc9, 0x48, 0x48, 0xb0, 0x38, 0x7e, 0x7e, 0x9a, 0x04, 0x0f, 0x23, 0xc9, 0x80,
0x0e, 0x98, 0xe3, 0x06, 0x27, 0xec, 0x46, 0x04, 0xb7, 0x4a, 0x26, 0x8b, 0xe5, 0x17, 0x5c, 0xe8,
0x66, 0xbf, 0xa7, 0xdd, 0x48, 0x08, 0x11, 0x0e, 0x33, 0x9a, 0xae, 0x08, 0x69, 0x18, 0x7d, 0x88,
0x2a, 0x0b, 0xef, 0x97, 0xe7, 0x50, 0xe5, 0x51, 0x0e, 0xa3, 0xc3, 0x0f, 0xc1, 0x24, 0xbd, 0x4f,
0x27, 0xb9, 0xfb, 0x67, 0x2e, 0xfd, 0xf8, 0xd9, 0xfd, 0x93, 0x32, 0x97, 0xc0, 0xcb, 0x7c, 0x16,
0xce, 0xbf, 0x4e, 0xe1, 0x8b, 0xe2, 0x21, 0xe3, 0xe1, 0x7b, 0x20, 0x4f, 0xbf, 0xe3, 0x7c, 0xfd,
0x3b, 0x97, 0x7e, 0x8b, 0x8c, 0x3e, 0xc8, 0x96, 0x8c, 0x96, 0xc8, 0x6c, 0xed, 0xff, 0x8c, 0x26,
0x8b, 0x87, 0x2c, 0xa1, 0x61, 0x05, 0xcc, 0xd2, 0xcf, 0x64, 0x8e, 0xbe, 0xcd, 0xa5, 0xdf, 0x0e,
0x93, 0xc8, 0x64, 0x28, 0x4b, 0xcd, 0xe8, 0xb1, 0x90, 0xfe, 0x7b, 0xa6, 0x1e, 0x8f, 0x2c, 0x4b,
0xd5, 0xbf, 0x99, 0x8c, 0xbb, 0x05, 0x2d, 0x6f, 0x74, 0x09, 0x5a, 0xde, 0x94, 0x74, 0x79, 0xa3,
0xf1, 0x88, 0xf2, 0x26, 0x30, 0xf0, 0xff, 0xc1, 0xe5, 0x0a, 0x26, 0x9f, 0x05, 0xe1, 0x73, 0xde,
0x1a, 0x8a, 0xb0, 0xdf, 0xd3, 0xa6, 0x39, 0xdc, 0xe7, 0x0e, 0x1d, 0xc5, 0x10, 0x78, 0x0b, 0x5c,
0x64, 0xc5, 0x97, 0x47, 0x2a, 0x3d, 0x72, 0x5e, 0x6d, 0x99, 0x13, 0x96, 0xc0, 0xf4, 0x3a, 0x6e,
0xbb, 0xc7, 0xb6, 0x4b, 0xb0, 0xdf, 0x3c, 0xde, 0x8e, 0x58, 0xa1, 0x9f, 0x92, 0x5f, 0x67, 0x8b,
0xfa, 0x8d, 0x36, 0x07, 0x18, 0x87, 0x91, 0x8e, 0x52, 0x14, 0xf8, 0x7d, 0x50, 0x48, 0x5a, 0xd0,
0x0b, 0x56, 0xf2, 0xa7, 0xe4, 0x92, 0x9f, 0x96, 0x31, 0xc2, 0x17, 0x3a, 0xca, 0xf0, 0xe0, 0x27,
0x60, 0x61, 0xa7, 0xd3, 0x72, 0x09, 0x6e, 0xa5, 0xe2, 0x9a, 0x62, 0x82, 0xb7, 0xfa, 0x3d, 0x4d,
0xe3, 0x82, 0x5d, 0x0e, 0x33, 0xb2, 0xf1, 0x0d, 0x57, 0x80, 0xef, 0x00, 0x80, 0x82, 0xae, 0xdf,
0xb2, 0xbd, 0x43, 0x8f, 0xa8, 0x0b, 0x2b, 0xca, 0x9d, 0xf1, 0xe2, 0x62, 0xbf, 0xa7, 0x41, 0xae,
0x17, 0x52, 0x9f, 0xd1, 0xa6, 0x4e, 0x1d, 0x49, 0x48, 0xf8, 0x11, 0x98, 0xb2, 0x8e, 0x3c, 0x52,
0xf5, 0x69, 0x7f, 0xea, 0x86, 0x58, 0x5d, 0xcc, 0xd4, 0xf3, 0x23, 0x8f, 0x18, 0x81, 0x6f, 0xec,
0x71, 0x00, 0xad, 0xe7, 0x32, 0x01, 0x6e, 0x82, 0x42, 0x29, 0xf0, 0x23, 0x2f, 0x62, 0xa1, 0x94,
0x0e, 0x70, 0xf3, 0xb9, 0x7a, 0x25, 0xdd, 0x5b, 0x9a, 0x03, 0x84, 0xd1, 0xa4, 0x10, 0x1d, 0x65,
0x58, 0xf0, 0x5d, 0x90, 0xb7, 0x7c, 0x77, 0xb7, 0x8d, 0x6b, 0x9d, 0x30, 0xd8, 0x53, 0x55, 0x26,
0x72, 0xa5, 0xdf, 0xd3, 0xe6, 0x44, 0x24, 0xcc, 0x69, 0x74, 0xa8, 0x97, 0x36, 0xb8, 0x01, 0x96,
0xa6, 0x5a, 0xc4, 0xc3, 0xce, 0x65, 0x3b, 0x52, 0xb5, 0x74, 0xaa, 0x45, 0xfc, 0xe2, 0x48, 0x59,
0xaa, 0x93, 0x14, 0x58, 0x3c, 0x11, 0xa9, 0x1f, 0x74, 0xf7, 0xf6, 0xda, 0x58, 0x5d, 0x49, 0x1f,
0x46, 0x2c, 0x12, 0x71, 0xc0, 0x40, 0x43, 0x30, 0xe0, 0xfb, 0x60, 0x52, 0x58, 0x4a, 0x6e, 0x84,
0x23, 0xf5, 0xe6, 0x4a, 0x2e, 0xf9, 0xba, 0x63, 0x85, 0x26, 0x75, 0xeb, 0x28, 0x81, 0x86, 0x5b,
0xd2, 0x80, 0x51, 0x0a, 0x0e, 0x0f, 0x5d, 0xbf, 0x15, 0xa9, 0x3a, 0x93, 0xb8, 0xd1, 0xef, 0x69,
0x57, 0xd3, 0x03, 0x46, 0x53, 0x60, 0xe4, 0xf9, 0x22, 0xe6, 0xd1, 0x33, 0x41, 0x5d, 0xdf, 0xc7,
0xe1, 0xc9, 0x8c, 0x74, 0x37, 0xdd, 0x9c, 0x42, 0xe6, 0x97, 0xa7, 0xa4, 0x14, 0x05, 0x96, 0x41,
0xc1, 0x3a, 0x22, 0x38, 0xf4, 0xdd, 0xf6, 0x89, 0xcc, 0x2a, 0x93, 0x91, 0x02, 0xc2, 0x02, 0x21,
0x0b, 0x65, 0x68, 0x34, 0xbd, 0x75, 0x12, 0xe2, 0x28, 0x72, 0x8e, 0x3b, 0x38, 0x52, 0x31, 0xdb,
0x96, 0x94, 0xde, 0x88, 0x39, 0x0d, 0x42, 0xbd, 0x3a, 0x92, 0xb1, 0xf4, 0x96, 0xf2, 0xcf, 0x2d,
0x7c, 0x5c, 0xf7, 0x3e, 0xc7, 0x6c, 0xfa, 0x19, 0x97, 0x13, 0x23, 0xc8, 0xb4, 0x6c, 0x46, 0xde,
0xe7, 0xf4, 0x96, 0x26, 0x08, 0x74, 0xea, 0x48, 0x18, 0x6c, 0x37, 0xdc, 0xc7, 0xea, 0x3e, 0x93,
0x59, 0xe9, 0xf7, 0xb4, 0xeb, 0x43, 0x65, 0x8c, 0x36, 0x85, 0xe9, 0x68, 0x08, 0x17, 0x3e, 0x05,
0xf3, 0x03, 0x6b, 0x77, 0x6f, 0xcf, 0x3b, 0x42, 0xae, 0xbf, 0x8f, 0xd5, 0x03, 0xa6, 0xa9, 0xf7,
0x7b, 0xda, 0x72, 0x56, 0x93, 0xe1, 0x8c, 0x90, 0x02, 0x75, 0x34, 0x94, 0x0f, 0x7f, 0x00, 0xae,
0x0c, 0xb3, 0x3b, 0x47, 0xbe, 0xea, 0x31, 0xe9, 0x37, 0xfa, 0x3d, 0x4d, 0x3f, 0x55, 0xda, 0x20,
0x47, 0xbe, 0x8e, 0x46, 0xc9, 0xd0, 0x69, 0xf0, 0xc4, 0xe5, 0x1c, 0xf9, 0xd5, 0x4e, 0xa4, 0xfe,
0x90, 0x29, 0x4b, 0x29, 0x95, 0x94, 0xc9, 0x91, 0x6f, 0x04, 0x9d, 0x48, 0x47, 0x69, 0xd6, 0x20,
0x2d, 0xbc, 0x49, 0x47, 0x7c, 0xa8, 0x1c, 0x97, 0x1b, 0xa9, 0xd0, 0xe1, 0xed, 0x3d, 0x3a, 0x49,
0x8b, 0x20, 0xc0, 0xb7, 0xc1, 0x04, 0x37, 0x3c, 0xa9, 0xd5, 0xf9, 0x2c, 0x39, 0x2e, 0xcf, 0xe1,
0x82, 0xfd, 0x29, 0x5d, 0x7d, 0x00, 0xd4, 0xbf, 0x9d, 0xe2, 0x13, 0x1f, 0x6d, 0x03, 0x15, 0xf7,
0x10, 0x8b, 0x06, 0x23, 0xb5, 0x01, 0xdf, 0x3d, 0xc4, 0x3a, 0x62, 0x4e, 0xb9, 0x11, 0x8d, 0x9d,
0xa3, 0x11, 0xad, 0x82, 0x4b, 0xcf, 0x4c, 0x9b, 0xa2, 0x73, 0xe9, 0x3e, 0xf4, 0x99, 0xdb, 0xe6,
0x60, 0x81, 0x80, 0x55, 0x30, 0xb7, 0x89, 0xdd, 0x90, 0xec, 0x62, 0x97, 0x94, 0x7d, 0x82, 0xc3,
0x17, 0x6e, 0x5b, 0xb4, 0x99, 0x9c, 0x7c, 0x9a, 0x07, 0x31, 0xc8, 0xf0, 0x04, 0x4a, 0x47, 0xc3,
0x98, 0xb0, 0x0c, 0x66, 0xad, 0x36, 0x6e, 0xd2, 0xdf, 0xcf, 0x1c, 0xef, 0x10, 0x07, 0x5d, 0xb2,
0x1d, 0xb1, 0x76, 0x93, 0x93, 0x9f, 0x2d, 0x16, 0x10, 0x83, 0x70, 0x8c, 0x8e, 0xb2, 0x2c, 0xfa,
0x72, 0x6d, 0x56, 0x5e, 0xf9, 0x59, 0xef, 0x20, 0x3b, 0x52, 0x17, 0xd2, 0xa5, 0xa4, 0xcd, 0x10,
0xf1, 0x98, 0xdd, 0x0d, 0xdb, 0x91, 0x8e, 0x32, 0x34, 0x88, 0xc0, 0x9c, 0xd9, 0x7a, 0x81, 0x43,
0xe2, 0x45, 0x58, 0x52, 0x5b, 0x64, 0x6a, 0xd2, 0xeb, 0x71, 0x63, 0x50, 0x52, 0x70, 0x18, 0x19,
0xbe, 0x1b, 0x8f, 0xac, 0x66, 0x97, 0x04, 0x8e, 0x5d, 0x17, 0x3d, 0x43, 0xca, 0x8d, 0xdb, 0x25,
0x81, 0x41, 0xa8, 0x40, 0x12, 0x49, 0x0b, 0xdb, 0x60, 0x84, 0x36, 0xbb, 0xe4, 0x40, 0xb4, 0x8a,
0x11, 0x53, 0xb7, 0xdb, 0x4d, 0x4d, 0xdd, 0x94, 0x02, 0xdf, 0x97, 0x45, 0x1e, 0x7b, 0x6d, 0xac,
0x5e, 0x65, 0xe9, 0x9e, 0xef, 0xf7, 0xb4, 0x82, 0x10, 0xa1, 0xec, 0x3d, 0x8f, 0x95, 0xf9, 0x24,
0x76, 0x10, 0xfd, 0x16, 0x3e, 0x66, 0xe4, 0xa5, 0xf4, 0xcd, 0xa2, 0x2f, 0x87, 0x73, 0x93, 0x48,
0x68, 0x67, 0x46, 0x62, 0x26, 0x70, 0x2d, 0x3d, 0xb0, 0x4b, 0xe3, 0x16, 0xd7, 0x19, 0x46, 0xa3,
0x67, 0xc1, 0xd3, 0x45, 0x67, 0x31, 0x96, 0x15, 0x8d, 0x65, 0x45, 0x3a, 0x0b, 0x91, 0x63, 0x36,
0xc3, 0xf1, 0x84, 0xa4, 0x28, 0xd0, 0x01, 0xb3, 0x27, 0x29, 0x3a, 0xd1, 0x59, 0x61, 0x3a, 0x52,
0xb1, 0xf1, 0x7c, 0x8f, 0x78, 0x6e, 0xdb, 0x18, 0x64, 0x59, 0x92, 0xcc, 0x0a, 0xd0, 0x5f, 0x58,
0xe9, 0xcf, 0x71, 0x7e, 0x6f, 0xb2, 0x1c, 0xa5, 0xe7, 0xdc, 0x41, 0x92, 0x65, 0x30, 0x2d, 0xd7,
0x6c, 0xe2, 0x4e, 0xa6, 0x59, 0x67, 0x12, 0xd2, 0x85, 0xe3, 0x63, 0x7a, 0x26, 0xd7, 0x43, 0xb8,
0xf0, 0x83, 0xc1, 0xcc, 0xcf, 0xce, 0xfb, 0xd6, 0xe8, 0x91, 0x9f, 0x1f, 0x77, 0x02, 0x1e, 0x6f,
0x26, 0x4e, 0xf7, 0xeb, 0x23, 0x87, 0x76, 0x4e, 0x96, 0xc1, 0x70, 0x3b, 0x35, 0x64, 0x33, 0x85,
0xdb, 0x67, 0xcd, 0xd8, 0x5c, 0x28, 0xcb, 0xa4, 0x63, 0x4a, 0x99, 0xa7, 0xa2, 0xd4, 0xee, 0xb2,
0x3f, 0xcc, 0xdc, 0x4d, 0xdf, 0x9d, 0x38, 0x55, 0x4d, 0x0e, 0xd0, 0x51, 0x8a, 0x41, 0x5f, 0x74,
0xd2, 0x52, 0x27, 0x2e, 0xc1, 0xa2, 0xb3, 0x4b, 0x07, 0x9c, 0x12, 0x32, 0x22, 0x0a, 0xd3, 0xd1,
0x30, 0x72, 0x56, 0xd3, 0x09, 0x9e, 0x63, 0x5f, 0x7d, 0xf3, 0x2c, 0x4d, 0x42, 0x61, 0x19, 0x4d,
0x46, 0x86, 0x8f, 0xc0, 0x54, 0xdd, 0x77, 0x3b, 0xd1, 0x41, 0x40, 0x4a, 0x41, 0xd7, 0x27, 0xea,
0x03, 0x56, 0x0b, 0xe5, 0x06, 0x23, 0xdc, 0x46, 0x93, 0xfa, 0x69, 0x83, 0x91, 0xf1, 0xd0, 0x06,
0xb3, 0x4f, 0xba, 0x01, 0x71, 0x8b, 0x6e, 0xf3, 0x39, 0xf6, 0x5b, 0xc5, 0x63, 0x82, 0x23, 0xf5,
0x6d, 0x26, 0x22, 0xcd, 0xef, 0x9f, 0x52, 0x88, 0xb1, 0xcb, 0x31, 0xc6, 0x2e, 0x05, 0xe9, 0x28,
0x4b, 0xa4, 0xad, 0xa4, 0x16, 0xe2, 0xa7, 0x01, 0xc1, 0xea, 0xa3, 0x74, 0xb9, 0xea, 0x84, 0xd8,
0x78, 0x11, 0xd0, 0xd3, 0x89, 0x31, 0xf2, 0x89, 0x04, 0x61, 0xd8, 0xed, 0x10, 0x3e, 0x1d, 0x7f,
0x94, 0xbe, 0xc6, 0x27, 0x27, 0xc2, 0x51, 0xf1, 0x84, 0x3c, 0x8c, 0xbc, 0xfa, 0x72, 0x4c, 0xfa,
0x33, 0x1f, 0x9c, 0x01, 0xf9, 0x4a, 0xd5, 0x69, 0xd4, 0x1d, 0x13, 0x39, 0xd6, 0x7a, 0xe1, 0x02,
0x5c, 0x04, 0xb0, 0x5c, 0x29, 0x3b, 0x65, 0xd3, 0xe6, 0xc6, 0x86, 0xe5, 0x94, 0xd6, 0x0b, 0x00,
0x16, 0xc0, 0x24, 0xb2, 0x24, 0x4b, 0x9e, 0x5a, 0xea, 0xe5, 0x0d, 0xc7, 0x42, 0xdb, 0xdc, 0x32,
0x0f, 0x57, 0xc0, 0xf5, 0x7a, 0x79, 0xe3, 0xc9, 0x4e, 0x99, 0x63, 0x1a, 0x66, 0x65, 0xbd, 0x81,
0xac, 0xed, 0xea, 0x53, 0xab, 0xb1, 0x6e, 0x3a, 0x66, 0x61, 0x01, 0xde, 0x04, 0x37, 0x32, 0x08,
0x13, 0x95, 0x36, 0xcb, 0x31, 0x64, 0x19, 0xde, 0x03, 0x6f, 0x9e, 0x26, 0xc2, 0xbe, 0xeb, 0x4e,
0xb5, 0xd6, 0x30, 0x37, 0xac, 0x8a, 0x53, 0xd0, 0xe0, 0x0d, 0x70, 0xb5, 0x68, 0x9b, 0xa5, 0xad,
0xcd, 0xaa, 0x6d, 0x35, 0x6a, 0x96, 0x85, 0x1a, 0xb5, 0x2a, 0x72, 0x1a, 0xce, 0xc7, 0x0d, 0xf4,
0x71, 0xa1, 0x05, 0x35, 0x70, 0x6d, 0xa7, 0x32, 0x1a, 0x80, 0xe1, 0x12, 0x58, 0x58, 0xb7, 0x6c,
0xf3, 0x93, 0x8c, 0xeb, 0xa5, 0x02, 0xaf, 0x83, 0x2b, 0x3b, 0x95, 0xe1, 0xde, 0x2f, 0x95, 0xd5,
0x2f, 0x00, 0xc8, 0x4b, 0xe3, 0x37, 0x54, 0xc1, 0x7c, 0x7c, 0x22, 0xd5, 0x8a, 0xd5, 0x78, 0x5c,
0xb5, 0xed, 0xea, 0x33, 0x0b, 0x15, 0x2e, 0x88, 0x4d, 0x65, 0x3c, 0x8d, 0x9d, 0x8a, 0x53, 0xb6,
0x1b, 0x0e, 0x2a, 0x6f, 0x6c, 0x58, 0xa8, 0x51, 0xaf, 0x98, 0xb5, 0xfa, 0x66, 0xd5, 0x29, 0x28,
0x10, 0x82, 0xe9, 0x98, 0x60, 0x5b, 0xe6, 0xba, 0x85, 0x0a, 0x63, 0xf0, 0x2e, 0xb8, 0x9d, 0xb4,
0x8d, 0xa2, 0xe7, 0x64, 0xfa, 0x93, 0x9d, 0x2a, 0xda, 0xd9, 0x2e, 0x5c, 0xa4, 0xa9, 0x8e, 0x6d,
0xa6, 0x6d, 0x17, 0xc6, 0xe1, 0x2d, 0xa0, 0xc5, 0x27, 0x2d, 0x1d, 0x72, 0x22, 0x72, 0x00, 0x1f,
0x82, 0x77, 0xce, 0x00, 0x8d, 0x8a, 0x22, 0x4f, 0x33, 0x33, 0x84, 0x2b, 0xf6, 0x33, 0x09, 0xdf,
0x06, 0x6f, 0x8d, 0x74, 0x8f, 0x12, 0x9d, 0x82, 0xab, 0xe0, 0x8d, 0x91, 0xd9, 0x4c, 0x06, 0xdf,
0x82, 0x26, 0xf8, 0xe0, 0x7c, 0xd8, 0x51, 0xcb, 0x61, 0xf8, 0x3a, 0x58, 0x19, 0x2d, 0x21, 0xb6,
0xb2, 0x07, 0xdf, 0x03, 0xdf, 0x3d, 0x0b, 0x35, 0x6a, 0x89, 0xfd, 0xd3, 0x97, 0x10, 0xe9, 0x3b,
0xa0, 0x4f, 0x67, 0x34, 0x8a, 0x26, 0xd4, 0x83, 0xff, 0x07, 0xf4, 0xa1, 0x77, 0x35, 0x79, 0x2c,
0x2f, 0x15, 0xb8, 0x06, 0xee, 0x22, 0xb3, 0xb2, 0x5e, 0xdd, 0x6e, 0x9c, 0x03, 0xff, 0xa5, 0x02,
0x3f, 0x04, 0xef, 0x9e, 0x0d, 0x1c, 0xb5, 0xc1, 0xaf, 0x14, 0x68, 0x81, 0x8f, 0xce, 0xbd, 0xde,
0x28, 0x99, 0xdf, 0x29, 0xf0, 0x26, 0xb8, 0x3e, 0x9c, 0x2f, 0xf2, 0xf0, 0x7b, 0x05, 0xde, 0x01,
0xb7, 0x4e, 0x5d, 0x49, 0x20, 0xff, 0xa0, 0xc0, 0xef, 0x81, 0x07, 0xa7, 0x41, 0x46, 0x85, 0xf1,
0x47, 0x05, 0x3e, 0x02, 0x0f, 0xcf, 0xb1, 0xc6, 0x28, 0x81, 0x3f, 0x9d, 0xb2, 0x0f, 0x91, 0xec,
0xaf, 0xcf, 0xde, 0x87, 0x40, 0xfe, 0x59, 0x81, 0xcb, 0xe0, 0xea, 0x70, 0x08, 0xbd, 0x13, 0x7f,
0x51, 0xe0, 0x6d, 0xb0, 0x72, 0xaa, 0x12, 0x85, 0xfd, 0x55, 0x81, 0x2a, 0x98, 0xab, 0x54, 0x1b,
0x8f, 0xcd, 0xb2, 0xdd, 0x78, 0x56, 0x76, 0x36, 0x1b, 0x75, 0x07, 0x59, 0xf5, 0x7a, 0xe1, 0x37,
0x63, 0x34, 0x94, 0x84, 0xa7, 0x52, 0x15, 0xce, 0xc6, 0xe3, 0x2a, 0x6a, 0xd8, 0xe5, 0xa7, 0x56,
0x85, 0x22, 0xbf, 0x18, 0x83, 0x33, 0x00, 0x50, 0x58, 0xad, 0x5a, 0xae, 0x38, 0xf5, 0xc2, 0x8f,
0x73, 0x70, 0x0a, 0xbc, 0x66, 0x7d, 0xec, 0x58, 0xa8, 0x62, 0xda, 0x85, 0x7f, 0xe4, 0x56, 0x03,
0x00, 0x06, 0xbf, 0x94, 0xc3, 0x4b, 0x60, 0x6c, 0xeb, 0x69, 0xe1, 0x02, 0x9c, 0x00, 0xe3, 0xb6,
0x65, 0xd6, 0xad, 0x82, 0x02, 0xe7, 0xc0, 0x8c, 0x65, 0x5b, 0x25, 0xa7, 0x5c, 0xad, 0x34, 0xd0,
0x4e, 0xa5, 0xc2, 0xca, 0x5e, 0x01, 0x4c, 0x3e, 0x33, 0x9d, 0xd2, 0x66, 0x6c, 0xc9, 0xc1, 0x05,
0x30, 0x6b, 0x57, 0x4b, 0x5b, 0x0d, 0x64, 0x96, 0x2c, 0x14, 0x9b, 0x2f, 0x52, 0x20, 0x13, 0x8a,
0x2d, 0xe3, 0xf7, 0x1f, 0x81, 0x09, 0x27, 0x74, 0xfd, 0xa8, 0x13, 0x84, 0x04, 0xde, 0x97, 0x3f,
0xa6, 0xc5, 0xdf, 0xf8, 0xc5, 0xff, 0xbe, 0x96, 0x66, 0x4e, 0xbe, 0xf9, 0xbf, 0xa0, 0xf4, 0x0b,
0x77, 0x94, 0xb7, 0x94, 0xe2, 0xfc, 0xcb, 0xbf, 0x2f, 0x5f, 0x78, 0xf9, 0x6a, 0x59, 0xf9, 0xfa,
0xd5, 0xb2, 0xf2, 0xb7, 0x57, 0xcb, 0xca, 0xaf, 0xbe, 0x59, 0xbe, 0xb0, 0x7b, 0x89, 0xfd, 0xef,
0xec, 0xc1, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x86, 0xcd, 0x31, 0x78, 0x84, 0x1b, 0x00, 0x00,
}

View File

@@ -274,6 +274,54 @@ enum FailureCase {
// must be able to process client requests.
SIGTERM_ALL = 5;
// SIGQUIT_AND_REMOVE_ONE_FOLLOWER stops a randomly chosen follower
// (non-leader), deletes its data directories on disk, and removes
// this member from cluster (membership reconfiguration). On recovery,
// tester adds a new member, and this member joins the existing cluster
// with fresh data. It waits "failure-delay-ms" before recovering this
// failure. This simulates destroying one follower machine, where operator
// needs to add a new member from a fresh machine.
// The expected behavior is that a new member joins the existing cluster,
// and then each member continues to process client requests.
SIGQUIT_AND_REMOVE_ONE_FOLLOWER = 10;
// SIGQUIT_AND_REMOVE_ONE_FOLLOWER_UNTIL_TRIGGER_SNAPSHOT stops a randomly
// chosen follower, deletes its data directories on disk, and removes
// this member from cluster (membership reconfiguration). On recovery,
// tester adds a new member, and this member joins the existing cluster
// restart. On member remove, cluster waits until most up-to-date node
// (leader) applies the snapshot count of entries since the stop operation.
// This simulates destroying a leader machine, where operator needs to add
// a new member from a fresh machine.
// The expected behavior is that a new member joins the existing cluster,
// and receives a snapshot from the active leader. As always, after
// recovery, each member must be able to process client requests.
SIGQUIT_AND_REMOVE_ONE_FOLLOWER_UNTIL_TRIGGER_SNAPSHOT = 11;
// SIGQUIT_AND_REMOVE_LEADER stops the active leader node, deletes its
// data directories on disk, and removes this member from cluster.
// On recovery, tester adds a new member, and this member joins the
// existing cluster with fresh data. It waits "failure-delay-ms" before
// recovering this failure. This simulates destroying a leader machine,
// where operator needs to add a new member from a fresh machine.
// The expected behavior is that a new member joins the existing cluster,
// and then each member continues to process client requests.
SIGQUIT_AND_REMOVE_LEADER = 12;
// SIGQUIT_AND_REMOVE_LEADER_UNTIL_TRIGGER_SNAPSHOT stops the active leader,
// deletes its data directories on disk, and removes this member from
// cluster (membership reconfiguration). On recovery, tester adds a new
// member, and this member joins the existing cluster restart. On member
// remove, cluster waits until most up-to-date node (new leader) applies
// the snapshot count of entries since the stop operation. This simulates
// destroying a leader machine, where operator needs to add a new member
// from a fresh machine.
// The expected behavior is that on member remove, cluster elects a new
// leader, and a new member joins the existing cluster and receives a
// snapshot from the newly elected leader. As always, after recovery, each
// member must be able to process client requests.
SIGQUIT_AND_REMOVE_LEADER_UNTIL_TRIGGER_SNAPSHOT = 13;
// BLACKHOLE_PEER_PORT_TX_RX_ONE_FOLLOWER drops all outgoing/incoming
// packets from/to the peer port on a randomly chosen follower
// (non-leader), and waits for "failure-delay-ms" until recovery.

View File

@@ -161,6 +161,19 @@ func (clus *Cluster) updateFailures() {
clus.failures = append(clus.failures,
new_FailureCase_SIGTERM_ALL(clus))
case "SIGQUIT_AND_REMOVE_ONE_FOLLOWER":
clus.failures = append(clus.failures,
new_FailureCase_SIGQUIT_AND_REMOVE_ONE_FOLLOWER(clus))
case "SIGQUIT_AND_REMOVE_ONE_FOLLOWER_UNTIL_TRIGGER_SNAPSHOT":
clus.failures = append(clus.failures,
new_FailureCase_SIGQUIT_AND_REMOVE_ONE_FOLLOWER_UNTIL_TRIGGER_SNAPSHOT(clus))
case "SIGQUIT_AND_REMOVE_LEADER":
clus.failures = append(clus.failures,
new_FailureCase_SIGQUIT_AND_REMOVE_LEADER(clus))
case "SIGQUIT_AND_REMOVE_LEADER_UNTIL_TRIGGER_SNAPSHOT":
clus.failures = append(clus.failures,
new_FailureCase_SIGQUIT_AND_REMOVE_LEADER_UNTIL_TRIGGER_SNAPSHOT(clus))
case "BLACKHOLE_PEER_PORT_TX_RX_ONE_FOLLOWER":
clus.failures = append(clus.failures,
new_FailureCase_BLACKHOLE_PEER_PORT_TX_RX_ONE_FOLLOWER(clus))
@@ -377,14 +390,12 @@ func (clus *Cluster) broadcast(op rpcpb.Operation) error {
}
func (clus *Cluster) sendOp(idx int, op rpcpb.Operation) error {
if op == rpcpb.Operation_INITIAL_START_ETCD {
clus.agentRequests[idx] = &rpcpb.Request{
Operation: op,
Member: clus.Members[idx],
Tester: clus.Tester,
}
} else {
clus.agentRequests[idx].Operation = op
// maintain the initial member object
// throughout the test time
clus.agentRequests[idx] = &rpcpb.Request{
Operation: op,
Member: clus.Members[idx],
Tester: clus.Tester,
}
err := clus.agentStreams[idx].Send(clus.agentRequests[idx])

View File

@@ -68,6 +68,13 @@ func read(lg *zap.Logger, fpath string) (*Cluster, error) {
clus.Members[i].Etcd.WALDir = filepath.Join(mem.Etcd.DataDir, "member", "wal")
}
switch mem.Etcd.InitialClusterState {
case "new":
case "existing":
default:
return nil, fmt.Errorf("'--initial-cluster-state' got %q", mem.Etcd.InitialClusterState)
}
if mem.Etcd.HeartbeatIntervalMs == 0 {
return nil, fmt.Errorf("'--heartbeat-interval' cannot be 0 (got %+v)", mem.Etcd)
}

View File

@@ -162,6 +162,10 @@ func Test_read(t *testing.T) {
"SIGTERM_LEADER_UNTIL_TRIGGER_SNAPSHOT",
"SIGTERM_QUORUM",
"SIGTERM_ALL",
"SIGQUIT_AND_REMOVE_ONE_FOLLOWER",
"SIGQUIT_AND_REMOVE_ONE_FOLLOWER_UNTIL_TRIGGER_SNAPSHOT",
// "SIGQUIT_AND_REMOVE_LEADER",
// "SIGQUIT_AND_REMOVE_LEADER_UNTIL_TRIGGER_SNAPSHOT",
"BLACKHOLE_PEER_PORT_TX_RX_ONE_FOLLOWER",
"BLACKHOLE_PEER_PORT_TX_RX_ONE_FOLLOWER_UNTIL_TRIGGER_SNAPSHOT",
"BLACKHOLE_PEER_PORT_TX_RX_LEADER",

View File

@@ -0,0 +1,229 @@
// Copyright 2018 The etcd Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package tester
import (
"context"
"fmt"
"sort"
"strings"
"time"
"github.com/coreos/etcd/clientv3"
"github.com/coreos/etcd/functional/rpcpb"
"go.uber.org/zap"
)
func inject_SIGQUIT_ETCD_AND_REMOVE_DATA(clus *Cluster, idx1 int) error {
cli1, err := clus.Members[idx1].CreateEtcdClient()
if err != nil {
return err
}
defer cli1.Close()
var mresp *clientv3.MemberListResponse
mresp, err = cli1.MemberList(context.Background())
mss := []string{}
if err == nil && mresp != nil {
mss = describeMembers(mresp)
}
clus.lg.Info(
"member list before disastrous machine failure",
zap.String("request-to", clus.Members[idx1].EtcdClientEndpoint),
zap.Strings("members", mss),
zap.Error(err),
)
if err != nil {
return err
}
sresp, serr := cli1.Status(context.Background(), clus.Members[idx1].EtcdClientEndpoint)
if serr != nil {
return serr
}
id1 := sresp.Header.MemberId
is1 := fmt.Sprintf("%016x", id1)
clus.lg.Info(
"disastrous machine failure START",
zap.String("target-endpoint", clus.Members[idx1].EtcdClientEndpoint),
zap.String("target-member-id", is1),
zap.Error(err),
)
err = clus.sendOp(idx1, rpcpb.Operation_SIGQUIT_ETCD_AND_REMOVE_DATA)
clus.lg.Info(
"disastrous machine failure END",
zap.String("target-endpoint", clus.Members[idx1].EtcdClientEndpoint),
zap.String("target-member-id", is1),
zap.Error(err),
)
if err != nil {
return err
}
time.Sleep(2 * time.Second)
idx2 := (idx1 + 1) % len(clus.Members)
var cli2 *clientv3.Client
cli2, err = clus.Members[idx2].CreateEtcdClient()
if err != nil {
return err
}
defer cli2.Close()
// FIXME(bug): this may block forever during
// "SIGQUIT_AND_REMOVE_LEADER_UNTIL_TRIGGER_SNAPSHOT"
// is the new leader too busy with snapshotting?
// is raft proposal dropped?
// enable client keepalive for failover?
clus.lg.Info(
"member remove after disaster START",
zap.String("target-endpoint", clus.Members[idx1].EtcdClientEndpoint),
zap.String("target-member-id", is1),
zap.String("request-to", clus.Members[idx2].EtcdClientEndpoint),
)
ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
_, err = cli2.MemberRemove(ctx, id1)
cancel()
clus.lg.Info(
"member remove after disaster END",
zap.String("target-endpoint", clus.Members[idx1].EtcdClientEndpoint),
zap.String("target-member-id", is1),
zap.String("request-to", clus.Members[idx2].EtcdClientEndpoint),
zap.Error(err),
)
if err != nil {
return err
}
time.Sleep(2 * time.Second)
mresp, err = cli2.MemberList(context.Background())
mss = []string{}
if err == nil && mresp != nil {
mss = describeMembers(mresp)
}
clus.lg.Info(
"member list after member remove",
zap.String("request-to", clus.Members[idx2].EtcdClientEndpoint),
zap.Strings("members", mss),
zap.Error(err),
)
return err
}
func recover_SIGQUIT_ETCD_AND_REMOVE_DATA(clus *Cluster, idx1 int) error {
idx2 := (idx1 + 1) % len(clus.Members)
cli2, err := clus.Members[idx2].CreateEtcdClient()
if err != nil {
return err
}
defer cli2.Close()
_, err = cli2.MemberAdd(context.Background(), clus.Members[idx1].Etcd.AdvertisePeerURLs)
clus.lg.Info(
"member add before fresh restart",
zap.String("target-endpoint", clus.Members[idx1].EtcdClientEndpoint),
zap.String("request-to", clus.Members[idx2].EtcdClientEndpoint),
zap.Error(err),
)
if err != nil {
return err
}
time.Sleep(2 * time.Second)
clus.Members[idx1].Etcd.InitialClusterState = "existing"
err = clus.sendOp(idx1, rpcpb.Operation_RESTART_ETCD)
clus.lg.Info(
"fresh restart after member add",
zap.String("target-endpoint", clus.Members[idx1].EtcdClientEndpoint),
zap.Error(err),
)
if err != nil {
return err
}
time.Sleep(2 * time.Second)
var mresp *clientv3.MemberListResponse
mresp, err = cli2.MemberList(context.Background())
mss := []string{}
if err == nil && mresp != nil {
mss = describeMembers(mresp)
}
clus.lg.Info(
"member list after member add",
zap.String("request-to", clus.Members[idx2].EtcdClientEndpoint),
zap.Strings("members", mss),
zap.Error(err),
)
return err
}
func new_FailureCase_SIGQUIT_AND_REMOVE_ONE_FOLLOWER(clus *Cluster) Failure {
ff := failureByFunc{
failureCase: rpcpb.FailureCase_SIGQUIT_AND_REMOVE_ONE_FOLLOWER,
injectMember: inject_SIGQUIT_ETCD_AND_REMOVE_DATA,
recoverMember: recover_SIGQUIT_ETCD_AND_REMOVE_DATA,
}
f := &failureFollower{ff, -1, -1}
return &failureDelay{
Failure: f,
delayDuration: clus.GetFailureDelayDuration(),
}
}
func new_FailureCase_SIGQUIT_AND_REMOVE_ONE_FOLLOWER_UNTIL_TRIGGER_SNAPSHOT(clus *Cluster) Failure {
return &failureUntilSnapshot{
failureCase: rpcpb.FailureCase_SIGQUIT_AND_REMOVE_ONE_FOLLOWER_UNTIL_TRIGGER_SNAPSHOT,
Failure: new_FailureCase_SIGQUIT_AND_REMOVE_ONE_FOLLOWER(clus),
}
}
func new_FailureCase_SIGQUIT_AND_REMOVE_LEADER(clus *Cluster) Failure {
ff := failureByFunc{
failureCase: rpcpb.FailureCase_SIGQUIT_AND_REMOVE_LEADER,
injectMember: inject_SIGQUIT_ETCD_AND_REMOVE_DATA,
recoverMember: recover_SIGQUIT_ETCD_AND_REMOVE_DATA,
}
f := &failureLeader{ff, -1, -1}
return &failureDelay{
Failure: f,
delayDuration: clus.GetFailureDelayDuration(),
}
}
func new_FailureCase_SIGQUIT_AND_REMOVE_LEADER_UNTIL_TRIGGER_SNAPSHOT(clus *Cluster) Failure {
return &failureUntilSnapshot{
failureCase: rpcpb.FailureCase_SIGQUIT_AND_REMOVE_LEADER_UNTIL_TRIGGER_SNAPSHOT,
Failure: new_FailureCase_SIGQUIT_AND_REMOVE_LEADER(clus),
}
}
func describeMembers(mresp *clientv3.MemberListResponse) (ss []string) {
ss = make([]string, len(mresp.Members))
for i, m := range mresp.Members {
ss[i] = fmt.Sprintf("Name %s / ID %016x / ClientURLs %s / PeerURLs %s",
m.Name,
m.ID,
strings.Join(m.ClientURLs, ","),
strings.Join(m.PeerURLs, ","),
)
}
sort.Strings(ss)
return ss
}

View File

@@ -37,6 +37,13 @@ func new_FailureCase_SIGTERM_ONE_FOLLOWER(clus *Cluster) Failure {
}
}
func new_FailureCase_SIGTERM_ONE_FOLLOWER_UNTIL_TRIGGER_SNAPSHOT(clus *Cluster) Failure {
return &failureUntilSnapshot{
failureCase: rpcpb.FailureCase_SIGTERM_ONE_FOLLOWER_UNTIL_TRIGGER_SNAPSHOT,
Failure: new_FailureCase_SIGTERM_ONE_FOLLOWER(clus),
}
}
func new_FailureCase_SIGTERM_LEADER(clus *Cluster) Failure {
ff := failureByFunc{
failureCase: rpcpb.FailureCase_SIGTERM_LEADER,
@@ -50,6 +57,13 @@ func new_FailureCase_SIGTERM_LEADER(clus *Cluster) Failure {
}
}
func new_FailureCase_SIGTERM_LEADER_UNTIL_TRIGGER_SNAPSHOT(clus *Cluster) Failure {
return &failureUntilSnapshot{
failureCase: rpcpb.FailureCase_SIGTERM_LEADER_UNTIL_TRIGGER_SNAPSHOT,
Failure: new_FailureCase_SIGTERM_LEADER(clus),
}
}
func new_FailureCase_SIGTERM_QUORUM(clus *Cluster) Failure {
f := &failureQuorum{
failureCase: rpcpb.FailureCase_SIGTERM_QUORUM,
@@ -73,17 +87,3 @@ func new_FailureCase_SIGTERM_ALL(clus *Cluster) Failure {
delayDuration: clus.GetFailureDelayDuration(),
}
}
func new_FailureCase_SIGTERM_ONE_FOLLOWER_UNTIL_TRIGGER_SNAPSHOT(clus *Cluster) Failure {
return &failureUntilSnapshot{
failureCase: rpcpb.FailureCase_SIGTERM_ONE_FOLLOWER_UNTIL_TRIGGER_SNAPSHOT,
Failure: new_FailureCase_SIGTERM_ONE_FOLLOWER(clus),
}
}
func new_FailureCase_SIGTERM_LEADER_UNTIL_TRIGGER_SNAPSHOT(clus *Cluster) Failure {
return &failureUntilSnapshot{
failureCase: rpcpb.FailureCase_SIGTERM_LEADER_UNTIL_TRIGGER_SNAPSHOT,
Failure: new_FailureCase_SIGTERM_LEADER(clus),
}
}

6
test
View File

@@ -180,7 +180,7 @@ function integration_extra {
function functional_pass {
# Clean up any data and logs from previous runs
rm -rf /tmp/etcd-agent-data-*
rm -rf /tmp/etcd-agent-data-* /tmp/etcd-agent-data-*.backup
for a in 1 2 3; do
./bin/etcd-agent --network tcp --address 127.0.0.1:${a}9027 &
@@ -621,8 +621,8 @@ function build_cov_pass {
# fail fast on static tests
function build_pass {
echo "Checking build..."
GO_BUILD_FLAGS="-a -v" etcd_build
GO_BUILD_FLAGS="-a -v" tools_build
GO_BUILD_FLAGS="-v" etcd_build
GO_BUILD_FLAGS="-v" tools_build
}
for pass in $PASSES; do