Browse Source

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

functional: add membership reconfiguration tests
Gyuho Lee 7 years ago
parent
commit
c77ffcc505

+ 8 - 0
functional.yaml

@@ -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)

+ 30 - 6
functional/agent/handler.go

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

+ 4 - 4
functional/build

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

+ 210 - 156
functional/rpcpb/rpc.pb.go

@@ -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,
 }

+ 48 - 0
functional/rpcpb/rpc.proto

@@ -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.

+ 19 - 8
functional/tester/cluster.go

@@ -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])

+ 7 - 0
functional/tester/cluster_read_config.go

@@ -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)
 		}

+ 4 - 0
functional/tester/cluster_test.go

@@ -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",

+ 229 - 0
functional/tester/failure_case_sigquit_remove.go

@@ -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
+}

+ 14 - 14
functional/tester/failure_case_sigterm.go

@@ -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),
-	}
-}

+ 3 - 3
test

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