From a9043c6f3dc0fe5437aea411e1233445dd4ac447 Mon Sep 17 00:00:00 2001
From: Manuel Kieweg <manuel.kieweg@h-da.de>
Date: Fri, 9 Jul 2021 16:59:21 +0000
Subject: [PATCH] Remove forks develop

---
 Dockerfile                                  |    1 -
 forks/goarista/gnmi/arbitration.go          |   58 -
 forks/goarista/gnmi/arbitration_test.go     |   73 --
 forks/goarista/gnmi/client.go               |  286 -----
 forks/goarista/gnmi/json.go                 |   35 -
 forks/goarista/gnmi/operation.go            |  517 ---------
 forks/goarista/gnmi/operation_test.go       |  423 -------
 forks/goarista/gnmi/path.go                 |  251 ----
 forks/goarista/gnmi/path_test.go            |  308 -----
 forks/google/gnmi/model.go                  |   79 --
 forks/google/gnmi/server.go                 |  602 ----------
 forks/google/gnmi/server_test.go            | 1161 -------------------
 forks/google/gnmi/util.go                   |  102 --
 go.mod                                      |   16 +-
 go.sum                                      |  498 ++++----
 nucleus/gnmi_transport.go                   |    2 +-
 nucleus/gnmi_transport_test.go              |    2 +-
 nucleus/initialise_test.go                  |    2 +-
 nucleus/principalNetworkDomain.go           |    2 +-
 test/integration/nucleusIntegration_test.go |    5 +-
 test/targets.go                             |    2 +-
 21 files changed, 237 insertions(+), 4188 deletions(-)
 delete mode 100644 forks/goarista/gnmi/arbitration.go
 delete mode 100644 forks/goarista/gnmi/arbitration_test.go
 delete mode 100644 forks/goarista/gnmi/client.go
 delete mode 100644 forks/goarista/gnmi/json.go
 delete mode 100644 forks/goarista/gnmi/operation.go
 delete mode 100644 forks/goarista/gnmi/operation_test.go
 delete mode 100644 forks/goarista/gnmi/path.go
 delete mode 100644 forks/goarista/gnmi/path_test.go
 delete mode 100644 forks/google/gnmi/model.go
 delete mode 100644 forks/google/gnmi/server.go
 delete mode 100644 forks/google/gnmi/server_test.go
 delete mode 100644 forks/google/gnmi/util.go

diff --git a/Dockerfile b/Dockerfile
index 145864fab..685baba00 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -16,7 +16,6 @@ FROM installer as builder
 COPY *.go ./
 COPY ./api ./api
 COPY ./cmd ./cmd
-COPY ./forks ./forks
 COPY ./interfaces ./interfaces
 COPY ./northbound ./northbound
 COPY ./nucleus ./nucleus
diff --git a/forks/goarista/gnmi/arbitration.go b/forks/goarista/gnmi/arbitration.go
deleted file mode 100644
index 78225d702..000000000
--- a/forks/goarista/gnmi/arbitration.go
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (c) 2019 Arista Networks, Inc.
-// Use of this source code is governed by the Apache License 2.0
-// that can be found in the COPYING file.
-
-package gnmi
-
-import (
-	"fmt"
-	"strconv"
-	"strings"
-
-	"github.com/openconfig/gnmi/proto/gnmi_ext"
-)
-
-// ArbitrationExt takes a string representation of a master arbitration value
-// (e.g. "23", "role:42") and return a *gnmi_ext.Extension.
-func ArbitrationExt(s string) (*gnmi_ext.Extension, error) {
-	if s == "" {
-		return nil, nil
-	}
-	roleID, electionID, err := parseArbitrationString(s)
-	if err != nil {
-		return nil, err
-	}
-	arb := &gnmi_ext.MasterArbitration{
-		Role:       &gnmi_ext.Role{Id: roleID},
-		ElectionId: &gnmi_ext.Uint128{High: 0, Low: electionID},
-	}
-	ext := gnmi_ext.Extension_MasterArbitration{MasterArbitration: arb}
-	return &gnmi_ext.Extension{Ext: &ext}, nil
-}
-
-// parseArbitrationString parses the supplied string and returns the role and election id
-// values. Input is of the form [<role>:]<election_id>, where election_id is a uint64.
-//
-// Examples:
-//  "1"
-//  "admin:42"
-func parseArbitrationString(s string) (string, uint64, error) {
-	tokens := strings.Split(s, ":")
-	switch len(tokens) {
-	case 1: // just election id
-		id, err := parseElectionID(tokens[0])
-		return "", id, err
-	case 2: // role and election id
-		id, err := parseElectionID(tokens[1])
-		return tokens[0], id, err
-	}
-	return "", 0, fmt.Errorf("badly formed arbitration id (%s)", s)
-}
-
-func parseElectionID(s string) (uint64, error) {
-	id, err := strconv.ParseUint(s, 0, 64)
-	if err != nil {
-		return 0, fmt.Errorf("badly formed arbitration id (%s)", s)
-	}
-	return id, nil
-}
diff --git a/forks/goarista/gnmi/arbitration_test.go b/forks/goarista/gnmi/arbitration_test.go
deleted file mode 100644
index cdcc37c35..000000000
--- a/forks/goarista/gnmi/arbitration_test.go
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright (c) 2019 Arista Networks, Inc.
-// Use of this source code is governed by the Apache License 2.0
-// that can be found in the COPYING file.
-
-package gnmi
-
-import (
-	"fmt"
-	"testing"
-
-	"github.com/aristanetworks/goarista/test"
-
-	"github.com/openconfig/gnmi/proto/gnmi_ext"
-)
-
-func arbitration(role string, id *gnmi_ext.Uint128) *gnmi_ext.Extension {
-	arb := &gnmi_ext.MasterArbitration{
-		Role:       &gnmi_ext.Role{Id: role},
-		ElectionId: id,
-	}
-	ext := gnmi_ext.Extension_MasterArbitration{MasterArbitration: arb}
-	return &gnmi_ext.Extension{Ext: &ext}
-}
-
-func electionID(high, low uint64) *gnmi_ext.Uint128 {
-	return &gnmi_ext.Uint128{High: high, Low: low}
-}
-
-func TestArbitrationExt(t *testing.T) {
-	testCases := map[string]struct {
-		s   string
-		ext *gnmi_ext.Extension
-		err error
-	}{
-		"empty": {},
-		"no_role": {
-			s:   "1",
-			ext: arbitration("", electionID(0, 1)),
-		},
-		"with_role": {
-			s:   "admin:1",
-			ext: arbitration("admin", electionID(0, 1)),
-		},
-		"large_no_role": {
-			s:   "9223372036854775807",
-			ext: arbitration("", electionID(0, 9223372036854775807)),
-		},
-		"large_with_role": {
-			s:   "admin:18446744073709551615",
-			ext: arbitration("admin", electionID(0, 18446744073709551615)),
-		},
-		"invalid": {
-			s:   "cat",
-			err: fmt.Errorf("badly formed arbitration id (%s)", "cat"),
-		},
-		"invalid_too_many_colons": {
-			s:   "dog:1:2",
-			err: fmt.Errorf("badly formed arbitration id (%s)", "dog:1:2"),
-		},
-	}
-
-	for name, tc := range testCases {
-		t.Run(name, func(t *testing.T) {
-			ext, err := ArbitrationExt(tc.s)
-			if !test.DeepEqual(tc.ext, ext) {
-				t.Errorf("Expected %#v, got %#v", tc.ext, ext)
-			}
-			if !test.DeepEqual(tc.err, err) {
-				t.Errorf("Expected %v, got %v", tc.err, err)
-			}
-		})
-	}
-}
diff --git a/forks/goarista/gnmi/client.go b/forks/goarista/gnmi/client.go
deleted file mode 100644
index c4512f2c8..000000000
--- a/forks/goarista/gnmi/client.go
+++ /dev/null
@@ -1,286 +0,0 @@
-// Copyright (c) 2017 Arista Networks, Inc.
-// Use of this source code is governed by the Apache License 2.0
-// that can be found in the COPYING file.
-
-package gnmi
-
-import (
-	"context"
-	"crypto/tls"
-	"crypto/x509"
-	"errors"
-	"fmt"
-	"math"
-	"net"
-	"os"
-
-	"io/ioutil"
-	"strings"
-
-	"github.com/golang/protobuf/proto"
-	pb "github.com/openconfig/gnmi/proto/gnmi"
-	"google.golang.org/grpc"
-	"google.golang.org/grpc/credentials"
-	"google.golang.org/grpc/encoding/gzip"
-	"google.golang.org/grpc/metadata"
-)
-
-const (
-	defaultPort = "6030"
-	// HostnameArg is the value to be replaced by the actual hostname
-	HostnameArg = "HOSTNAME"
-)
-
-// PublishFunc is the method to publish responses
-type PublishFunc func(addr string, message proto.Message)
-
-// ParseHostnames parses a comma-separated list of names and replaces HOSTNAME with the current
-// hostname in it
-func ParseHostnames(list string) ([]string, error) {
-	items := strings.Split(list, ",")
-	hostname, err := os.Hostname()
-	if err != nil {
-		return nil, err
-	}
-	names := make([]string, len(items))
-	for i, name := range items {
-		if name == HostnameArg {
-			name = hostname
-		}
-		names[i] = name
-	}
-	return names, nil
-}
-
-// Config is the gnmi.Client config
-type Config struct {
-	Addr        string
-	CAFile      string
-	CertFile    string
-	KeyFile     string
-	Password    string
-	Username    string
-	TLS         bool
-	Compression string
-	DialOptions []grpc.DialOption
-	Token       string
-	Encoding    pb.Encoding
-}
-
-// SubscribeOptions is the gNMI subscription request options
-type SubscribeOptions struct {
-	UpdatesOnly       bool
-	Prefix            string
-	Mode              string
-	StreamMode        string
-	SampleInterval    uint64
-	SuppressRedundant bool
-	HeartbeatInterval uint64
-	Paths             [][]string
-	Origin            string
-	Target            string
-}
-
-// accessTokenCred implements credentials.PerRPCCredentials, the gRPC
-// interface for credentials that need to attach security information
-// to every RPC.
-type accessTokenCred struct {
-	bearerToken string
-}
-
-// newAccessTokenCredential constructs a new per-RPC credential from a token.
-func newAccessTokenCredential(token string) credentials.PerRPCCredentials {
-	bearerFmt := "Bearer %s"
-	return &accessTokenCred{bearerToken: fmt.Sprintf(bearerFmt, token)}
-}
-
-func (a *accessTokenCred) GetRequestMetadata(ctx context.Context,
-	uri ...string) (map[string]string, error) {
-	authHeader := "Authorization"
-	return map[string]string{
-		authHeader: a.bearerToken,
-	}, nil
-}
-
-func (a *accessTokenCred) RequireTransportSecurity() bool { return true }
-
-// DialContext connects to a gnmi service and returns a client
-func DialContext(ctx context.Context, cfg *Config) (pb.GNMIClient, error) {
-	opts := append([]grpc.DialOption(nil), cfg.DialOptions...)
-
-	switch cfg.Compression {
-	case "":
-	case "gzip":
-		opts = append(opts, grpc.WithDefaultCallOptions(grpc.UseCompressor(gzip.Name)))
-	default:
-		return nil, fmt.Errorf("unsupported compression option: %q", cfg.Compression)
-	}
-
-	if cfg.TLS || cfg.CAFile != "" || cfg.CertFile != "" || cfg.Token != "" {
-		tlsConfig := &tls.Config{
-			MinVersion: tls.VersionTLS12,
-		}
-		if cfg.CAFile != "" {
-			b, err := ioutil.ReadFile(cfg.CAFile)
-			if err != nil {
-				return nil, err
-			}
-			cp := x509.NewCertPool()
-			if !cp.AppendCertsFromPEM(b) {
-				return nil, fmt.Errorf("credentials: failed to append certificates")
-			}
-			tlsConfig.RootCAs = cp
-		} else {
-			tlsConfig.InsecureSkipVerify = true
-		}
-		if cfg.CertFile != "" {
-			if cfg.KeyFile == "" {
-				return nil, fmt.Errorf("please provide both -certfile and -keyfile")
-			}
-			cert, err := tls.LoadX509KeyPair(cfg.CertFile, cfg.KeyFile)
-			if err != nil {
-				return nil, err
-			}
-			tlsConfig.Certificates = []tls.Certificate{cert}
-		}
-		if cfg.Token != "" {
-			opts = append(opts,
-				grpc.WithPerRPCCredentials(newAccessTokenCredential(cfg.Token)))
-		}
-		opts = append(opts, grpc.WithTransportCredentials(credentials.NewTLS(tlsConfig)))
-	} else {
-		opts = append(opts, grpc.WithInsecure())
-	}
-
-	dial := func(ctx context.Context, addrIn string) (conn net.Conn, err error) {
-		var network, addr string
-
-		split := strings.Split(addrIn, "://")
-		if l := len(split); l == 2 {
-			network = split[0]
-			addr = split[1]
-		} else {
-			network = "tcp"
-			addr = split[0]
-		}
-
-		conn, err = (&net.Dialer{}).DialContext(ctx, network, addr)
-		return
-	}
-
-	opts = append(opts,
-		grpc.WithContextDialer(dial),
-
-		// Allows received protobuf messages to be larger than 4MB
-		grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(math.MaxInt32)),
-	)
-
-	grpcconn, err := grpc.DialContext(ctx, cfg.Addr, opts...)
-	if err != nil {
-		return nil, fmt.Errorf("failed to dial: %s", err)
-	}
-
-	return pb.NewGNMIClient(grpcconn), nil
-}
-
-// Dial connects to a gnmi service and returns a client
-func Dial(cfg *Config) (pb.GNMIClient, error) {
-	return DialContext(context.Background(), cfg)
-}
-
-// NewContext returns a new context with username and password
-// metadata if they are set in cfg.
-func NewContext(ctx context.Context, cfg *Config) context.Context {
-	if cfg.Username != "" {
-		ctx = metadata.NewOutgoingContext(ctx, metadata.Pairs(
-			"username", cfg.Username,
-			"password", cfg.Password))
-	}
-	return ctx
-}
-
-// NewGetRequest returns a GetRequest for the given paths
-func NewGetRequest(ctx context.Context, paths [][]string, origin string) (*pb.GetRequest, error) {
-	val := ctx.Value("config")
-	cfg, ok := val.(*Config)
-	if !ok {
-		return nil, errors.New("invalid type assertion")
-	}
-	req := &pb.GetRequest{
-		Path:     make([]*pb.Path, len(paths)),
-		Encoding: cfg.Encoding,
-	}
-	for i, p := range paths {
-		gnmiPath, err := ParseGNMIElements(p)
-		if err != nil {
-			return nil, err
-		}
-		req.Path[i] = gnmiPath
-		req.Path[i].Origin = origin
-	}
-	return req, nil
-}
-
-// NewSubscribeRequest returns a SubscribeRequest for the given paths
-func NewSubscribeRequest(subscribeOptions *SubscribeOptions) (*pb.SubscribeRequest, error) {
-	var mode pb.SubscriptionList_Mode
-	switch subscribeOptions.Mode {
-	case "once":
-		mode = pb.SubscriptionList_ONCE
-	case "poll":
-		mode = pb.SubscriptionList_POLL
-	case "":
-		fallthrough
-	case "stream":
-		mode = pb.SubscriptionList_STREAM
-	default:
-		return nil, fmt.Errorf("subscribe mode (%s) invalid", subscribeOptions.Mode)
-	}
-
-	var streamMode pb.SubscriptionMode
-	switch subscribeOptions.StreamMode {
-	case "on_change":
-		streamMode = pb.SubscriptionMode_ON_CHANGE
-	case "sample":
-		streamMode = pb.SubscriptionMode_SAMPLE
-	case "":
-		fallthrough
-	case "target_defined":
-		streamMode = pb.SubscriptionMode_TARGET_DEFINED
-	default:
-		return nil, fmt.Errorf("subscribe stream mode (%s) invalid", subscribeOptions.StreamMode)
-	}
-
-	prefixPath, err := ParseGNMIElements(SplitPath(subscribeOptions.Prefix))
-	if err != nil {
-		return nil, err
-	}
-	subList := &pb.SubscriptionList{
-		Subscription: make([]*pb.Subscription, len(subscribeOptions.Paths)),
-		Mode:         mode,
-		UpdatesOnly:  subscribeOptions.UpdatesOnly,
-		Prefix:       prefixPath,
-	}
-	if subscribeOptions.Target != "" {
-		if subList.Prefix == nil {
-			subList.Prefix = &pb.Path{}
-		}
-		subList.Prefix.Target = subscribeOptions.Target
-	}
-	for i, p := range subscribeOptions.Paths {
-		gnmiPath, err := ParseGNMIElements(p)
-		if err != nil {
-			return nil, err
-		}
-		gnmiPath.Origin = subscribeOptions.Origin
-		subList.Subscription[i] = &pb.Subscription{
-			Path:              gnmiPath,
-			Mode:              streamMode,
-			SampleInterval:    subscribeOptions.SampleInterval,
-			SuppressRedundant: subscribeOptions.SuppressRedundant,
-			HeartbeatInterval: subscribeOptions.HeartbeatInterval,
-		}
-	}
-	return &pb.SubscribeRequest{Request: &pb.SubscribeRequest_Subscribe{
-		Subscribe: subList}}, nil
-}
diff --git a/forks/goarista/gnmi/json.go b/forks/goarista/gnmi/json.go
deleted file mode 100644
index 30aacd3df..000000000
--- a/forks/goarista/gnmi/json.go
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (c) 2017 Arista Networks, Inc.
-// Use of this source code is governed by the Apache License 2.0
-// that can be found in the COPYING file.
-
-package gnmi
-
-import (
-	"github.com/openconfig/gnmi/proto/gnmi"
-)
-
-// NotificationToMap converts a Notification into a map[string]interface{}
-func NotificationToMap(notif *gnmi.Notification) (map[string]interface{}, error) {
-	m := make(map[string]interface{}, 1)
-	m["timestamp"] = notif.Timestamp
-	m["path"] = StrPath(notif.Prefix)
-	if len(notif.Update) != 0 {
-		updates := make(map[string]interface{}, len(notif.Update))
-		var err error
-		for _, update := range notif.Update {
-			updates[StrPath(update.Path)] = StrUpdateVal(update)
-			if err != nil {
-				return nil, err
-			}
-		}
-		m["updates"] = updates
-	}
-	if len(notif.Delete) != 0 {
-		deletes := make([]string, len(notif.Delete))
-		for i, del := range notif.Delete {
-			deletes[i] = StrPath(del)
-		}
-		m["deletes"] = deletes
-	}
-	return m, nil
-}
diff --git a/forks/goarista/gnmi/operation.go b/forks/goarista/gnmi/operation.go
deleted file mode 100644
index 01005d6f0..000000000
--- a/forks/goarista/gnmi/operation.go
+++ /dev/null
@@ -1,517 +0,0 @@
-// Copyright (c) 2017 Arista Networks, Inc.
-// Use of this source code is governed by the Apache License 2.0
-// that can be found in the COPYING file.
-
-package gnmi
-
-import (
-	"bufio"
-	"bytes"
-	"context"
-	"encoding/base64"
-	"encoding/json"
-	"errors"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"math"
-	"os"
-	"path"
-	"strconv"
-	"strings"
-	"time"
-
-	pb "github.com/openconfig/gnmi/proto/gnmi"
-	"github.com/openconfig/gnmi/proto/gnmi_ext"
-)
-
-// GetWithRequest takes a fully formed GetRequest, performs the Get,
-// and displays any response.
-func GetWithRequest(ctx context.Context, client pb.GNMIClient,
-	req *pb.GetRequest) error {
-	resp, err := client.Get(ctx, req)
-	if err != nil {
-		return err
-	}
-	for _, notif := range resp.Notification {
-		prefix := StrPath(notif.Prefix)
-		for _, update := range notif.Update {
-			fmt.Printf("%s:\n", path.Join(prefix, StrPath(update.Path)))
-			fmt.Println(StrUpdateVal(update))
-		}
-	}
-	return nil
-}
-
-// Get sends a GetRequest to the given server.
-func Get(ctx context.Context, client pb.GNMIClient, paths [][]string,
-	origin string) error {
-	req, err := NewGetRequest(ctx, paths, origin)
-	if err != nil {
-		return err
-	}
-	return GetWithRequest(ctx, client, req)
-}
-
-// val may be a path to a file or it may be json. First see if it is a
-// file, if so return its contents, otherwise return val
-func extractJSON(val string) []byte {
-	if jsonBytes, err := ioutil.ReadFile(val); err == nil {
-		return jsonBytes
-	}
-	// Best effort check if the value might a string literal, in which
-	// case wrap it in quotes. This is to allow a user to do:
-	//   gnmi update ../hostname host1234
-	//   gnmi update ../description 'This is a description'
-	// instead of forcing them to quote the string:
-	//   gnmi update ../hostname '"host1234"'
-	//   gnmi update ../description '"This is a description"'
-	maybeUnquotedStringLiteral := func(s string) bool {
-		if s == "true" || s == "false" || s == "null" || // JSON reserved words
-			strings.ContainsAny(s, `"'{}[]`) { // Already quoted or is a JSON object or array
-			return false
-		} else if _, err := strconv.ParseInt(s, 0, 32); err == nil {
-			// Integer. Using byte size of 32 because larger integer
-			// types are supposed to be sent as strings in JSON.
-			return false
-		} else if _, err := strconv.ParseFloat(s, 64); err == nil {
-			// Float
-			return false
-		}
-
-		return true
-	}
-	if maybeUnquotedStringLiteral(val) {
-		out := make([]byte, len(val)+2)
-		out[0] = '"'
-		copy(out[1:], val)
-		out[len(out)-1] = '"'
-		return out
-	}
-	return []byte(val)
-}
-
-// StrUpdateVal will return a string representing the value within the supplied update
-func StrUpdateVal(u *pb.Update) string {
-	if u.Value != nil {
-		// Backwards compatibility with pre-v0.4 gnmi
-		switch u.Value.Type {
-		case pb.Encoding_JSON, pb.Encoding_JSON_IETF:
-			return strJSON(u.Value.Value)
-		case pb.Encoding_BYTES, pb.Encoding_PROTO:
-			return base64.StdEncoding.EncodeToString(u.Value.Value)
-		case pb.Encoding_ASCII:
-			return string(u.Value.Value)
-		default:
-			return string(u.Value.Value)
-		}
-	}
-	return StrVal(u.Val)
-}
-
-// StrVal will return a string representing the supplied value
-func StrVal(val *pb.TypedValue) string {
-	switch v := val.GetValue().(type) {
-	case *pb.TypedValue_StringVal:
-		return v.StringVal
-	case *pb.TypedValue_JsonIetfVal:
-		return strJSON(v.JsonIetfVal)
-	case *pb.TypedValue_JsonVal:
-		return strJSON(v.JsonVal)
-	case *pb.TypedValue_IntVal:
-		return strconv.FormatInt(v.IntVal, 10)
-	case *pb.TypedValue_UintVal:
-		return strconv.FormatUint(v.UintVal, 10)
-	case *pb.TypedValue_BoolVal:
-		return strconv.FormatBool(v.BoolVal)
-	case *pb.TypedValue_BytesVal:
-		return base64.StdEncoding.EncodeToString(v.BytesVal)
-	case *pb.TypedValue_DecimalVal:
-		return strDecimal64(v.DecimalVal)
-	case *pb.TypedValue_FloatVal:
-		return strconv.FormatFloat(float64(v.FloatVal), 'g', -1, 32)
-	case *pb.TypedValue_LeaflistVal:
-		return strLeaflist(v.LeaflistVal)
-	case *pb.TypedValue_AsciiVal:
-		return v.AsciiVal
-	case *pb.TypedValue_AnyVal:
-		return v.AnyVal.String()
-	case *pb.TypedValue_ProtoBytes:
-		return base64.StdEncoding.EncodeToString(v.ProtoBytes)
-	default:
-		panic(v)
-	}
-}
-
-func strJSON(inJSON []byte) string {
-	var (
-		out bytes.Buffer
-		err error
-	)
-	// Check for ',' as simple heuristic on whether to expand JSON
-	// onto multiple lines, or compact it to a single line.
-	if bytes.Contains(inJSON, []byte{','}) {
-		err = json.Indent(&out, inJSON, "", "  ")
-	} else {
-		err = json.Compact(&out, inJSON)
-	}
-	if err != nil {
-		return fmt.Sprintf("(error unmarshalling json: %s)\n", err) + string(inJSON)
-	}
-	return out.String()
-}
-
-func strDecimal64(d *pb.Decimal64) string {
-	var i, frac int64
-	if d.Precision > 0 {
-		div := int64(10)
-		it := d.Precision - 1
-		for it > 0 {
-			div *= 10
-			it--
-		}
-		i = d.Digits / div
-		frac = d.Digits % div
-	} else {
-		i = d.Digits
-	}
-	if frac < 0 {
-		frac = -frac
-	}
-	return fmt.Sprintf("%d.%d", i, frac)
-}
-
-// strLeafList builds a human-readable form of a leaf-list. e.g. [1, 2, 3] or [a, b, c]
-func strLeaflist(v *pb.ScalarArray) string {
-	var b strings.Builder
-	b.WriteByte('[')
-
-	for i, elm := range v.Element {
-		b.WriteString(StrVal(elm))
-		if i < len(v.Element)-1 {
-			b.WriteString(", ")
-		}
-	}
-
-	b.WriteByte(']')
-	return b.String()
-}
-
-// TypedValue marshals an interface into a gNMI TypedValue value
-func TypedValue(val interface{}) *pb.TypedValue {
-	// TODO: handle more types:
-	// float64
-	// maps
-	// key.Key
-	// key.Map
-	// ... etc
-	switch v := val.(type) {
-	case string:
-		return &pb.TypedValue{Value: &pb.TypedValue_StringVal{StringVal: v}}
-	case int:
-		return &pb.TypedValue{Value: &pb.TypedValue_IntVal{IntVal: int64(v)}}
-	case int8:
-		return &pb.TypedValue{Value: &pb.TypedValue_IntVal{IntVal: int64(v)}}
-	case int16:
-		return &pb.TypedValue{Value: &pb.TypedValue_IntVal{IntVal: int64(v)}}
-	case int32:
-		return &pb.TypedValue{Value: &pb.TypedValue_IntVal{IntVal: int64(v)}}
-	case int64:
-		return &pb.TypedValue{Value: &pb.TypedValue_IntVal{IntVal: v}}
-	case uint:
-		return &pb.TypedValue{Value: &pb.TypedValue_UintVal{UintVal: uint64(v)}}
-	case uint8:
-		return &pb.TypedValue{Value: &pb.TypedValue_UintVal{UintVal: uint64(v)}}
-	case uint16:
-		return &pb.TypedValue{Value: &pb.TypedValue_UintVal{UintVal: uint64(v)}}
-	case uint32:
-		return &pb.TypedValue{Value: &pb.TypedValue_UintVal{UintVal: uint64(v)}}
-	case uint64:
-		return &pb.TypedValue{Value: &pb.TypedValue_UintVal{UintVal: v}}
-	case bool:
-		return &pb.TypedValue{Value: &pb.TypedValue_BoolVal{BoolVal: v}}
-	case float32:
-		return &pb.TypedValue{Value: &pb.TypedValue_FloatVal{FloatVal: v}}
-	case []interface{}:
-		gnmiElems := make([]*pb.TypedValue, len(v))
-		for i, elem := range v {
-			gnmiElems[i] = TypedValue(elem)
-		}
-		return &pb.TypedValue{
-			Value: &pb.TypedValue_LeaflistVal{
-				LeaflistVal: &pb.ScalarArray{
-					Element: gnmiElems,
-				}}}
-	default:
-		panic(fmt.Sprintf("unexpected type %T for value %v", val, val))
-	}
-}
-
-// ExtractValue pulls a value out of a gNMI Update, parsing JSON if present.
-// Possible return types:
-//  string
-//  int64
-//  uint64
-//  bool
-//  []byte
-//  float32
-//  *gnmi.Decimal64
-//  json.Number
-//  *any.Any
-//  []interface{}
-//  map[string]interface{}
-func ExtractValue(update *pb.Update) (interface{}, error) {
-	var i interface{}
-	var err error
-	if update == nil {
-		return nil, fmt.Errorf("empty update")
-	}
-	if update.Val != nil {
-		i, err = extractValueV04(update.Val)
-	} else if update.Value != nil {
-		i, err = extractValueV03(update.Value)
-	}
-	return i, err
-}
-
-func extractValueV04(val *pb.TypedValue) (interface{}, error) {
-	switch v := val.Value.(type) {
-	case *pb.TypedValue_StringVal:
-		return v.StringVal, nil
-	case *pb.TypedValue_IntVal:
-		return v.IntVal, nil
-	case *pb.TypedValue_UintVal:
-		return v.UintVal, nil
-	case *pb.TypedValue_BoolVal:
-		return v.BoolVal, nil
-	case *pb.TypedValue_BytesVal:
-		return v.BytesVal, nil
-	case *pb.TypedValue_FloatVal:
-		return v.FloatVal, nil
-	case *pb.TypedValue_DecimalVal:
-		return v.DecimalVal, nil
-	case *pb.TypedValue_LeaflistVal:
-		elementList := v.LeaflistVal.Element
-		l := make([]interface{}, len(elementList))
-		for i, element := range elementList {
-			el, err := extractValueV04(element)
-			if err != nil {
-				return nil, err
-			}
-			l[i] = el
-		}
-		return l, nil
-	case *pb.TypedValue_AnyVal:
-		return v.AnyVal, nil
-	case *pb.TypedValue_JsonVal:
-		return decode(v.JsonVal)
-	case *pb.TypedValue_JsonIetfVal:
-		return decode(v.JsonIetfVal)
-	case *pb.TypedValue_AsciiVal:
-		return v.AsciiVal, nil
-	case *pb.TypedValue_ProtoBytes:
-		return v.ProtoBytes, nil
-	}
-	return nil, fmt.Errorf("unhandled type of value %v", val.GetValue())
-}
-
-func extractValueV03(val *pb.Value) (interface{}, error) {
-	switch val.Type {
-	case pb.Encoding_JSON, pb.Encoding_JSON_IETF:
-		return decode(val.Value)
-	case pb.Encoding_BYTES, pb.Encoding_PROTO:
-		return val.Value, nil
-	case pb.Encoding_ASCII:
-		return string(val.Value), nil
-	}
-	return nil, fmt.Errorf("unhandled type of value %v", val.GetValue())
-}
-
-func decode(byteArr []byte) (interface{}, error) {
-	decoder := json.NewDecoder(bytes.NewReader(byteArr))
-	decoder.UseNumber()
-	var value interface{}
-	err := decoder.Decode(&value)
-	return value, err
-}
-
-// DecimalToFloat converts a gNMI Decimal64 to a float64
-func DecimalToFloat(dec *pb.Decimal64) float64 {
-	return float64(dec.Digits) / math.Pow10(int(dec.Precision))
-}
-
-func update(p *pb.Path, val string) (*pb.Update, error) {
-	var v *pb.TypedValue
-	switch p.Origin {
-	case "":
-		v = &pb.TypedValue{
-			Value: &pb.TypedValue_JsonIetfVal{JsonIetfVal: extractJSON(val)}}
-	case "eos_native":
-		v = &pb.TypedValue{
-			Value: &pb.TypedValue_JsonVal{JsonVal: extractJSON(val)}}
-	case "cli", "test-regen-cli":
-		v = &pb.TypedValue{
-			Value: &pb.TypedValue_AsciiVal{AsciiVal: val}}
-	case "p4_config":
-		b, err := ioutil.ReadFile(val)
-		if err != nil {
-			return nil, err
-		}
-		v = &pb.TypedValue{
-			Value: &pb.TypedValue_ProtoBytes{ProtoBytes: b}}
-	default:
-		return nil, fmt.Errorf("unexpected origin: %q", p.Origin)
-	}
-
-	return &pb.Update{Path: p, Val: v}, nil
-}
-
-// Operation describes an gNMI operation.
-type Operation struct {
-	Type   string
-	Origin string
-	Target string
-	Path   []string
-	Val    string
-}
-
-func newSetRequest(setOps []*Operation, exts ...*gnmi_ext.Extension) (*pb.SetRequest, error) {
-	req := &pb.SetRequest{}
-	for _, op := range setOps {
-		p, err := ParseGNMIElements(op.Path)
-		if err != nil {
-			return nil, err
-		}
-		p.Origin = op.Origin
-
-		// Target must apply to the entire SetRequest.
-		if op.Target != "" {
-			req.Prefix = &pb.Path{
-				Target: op.Target,
-			}
-		}
-
-		switch op.Type {
-		case "delete":
-			req.Delete = append(req.Delete, p)
-		case "update":
-			u, err := update(p, op.Val)
-			if err != nil {
-				return nil, err
-			}
-			req.Update = append(req.Update, u)
-		case "replace":
-			u, err := update(p, op.Val)
-			if err != nil {
-				return nil, err
-			}
-			req.Replace = append(req.Replace, u)
-		}
-	}
-	for _, ext := range exts {
-		req.Extension = append(req.Extension, ext)
-	}
-	return req, nil
-}
-
-// Set sends a SetRequest to the given client.
-func Set(ctx context.Context, client pb.GNMIClient, setOps []*Operation,
-	exts ...*gnmi_ext.Extension) (*pb.SetResponse, error) {
-	req, err := newSetRequest(setOps, exts...)
-	if err != nil {
-		return nil, err
-	}
-	return client.Set(ctx, req)
-}
-
-// Subscribe sends a SubscribeRequest to the given client.
-// Deprecated: Use SubscribeErr instead.
-func Subscribe(ctx context.Context, client pb.GNMIClient, subscribeOptions *SubscribeOptions,
-	respChan chan<- *pb.SubscribeResponse, errChan chan<- error) {
-	defer close(errChan)
-	if err := SubscribeErr(ctx, client, subscribeOptions, respChan); err != nil {
-		errChan <- err
-	}
-}
-
-// SubscribeErr makes a gNMI.Subscribe call and writes the responses
-// to the respChan. Before returning respChan will be closed.
-func SubscribeErr(ctx context.Context, client pb.GNMIClient, subscribeOptions *SubscribeOptions,
-	respChan chan<- *pb.SubscribeResponse) error {
-	ctx, cancel := context.WithCancel(ctx)
-	defer cancel()
-	defer close(respChan)
-
-	stream, err := client.Subscribe(ctx)
-	if err != nil {
-		return err
-	}
-	req, err := NewSubscribeRequest(subscribeOptions)
-	if err != nil {
-		return err
-	}
-	if err := stream.Send(req); err != nil {
-		return err
-	}
-
-	for {
-		resp, err := stream.Recv()
-		if err != nil {
-			if err == io.EOF {
-				return nil
-			}
-			return err
-		}
-		respChan <- resp
-
-		// For POLL subscriptions, initiate a poll request by pressing ENTER
-		if subscribeOptions.Mode == "poll" {
-			switch resp.Response.(type) {
-			case *pb.SubscribeResponse_SyncResponse:
-				fmt.Print("Press ENTER to send a poll request: ")
-				reader := bufio.NewReader(os.Stdin)
-				reader.ReadString('\n')
-
-				pollReq := &pb.SubscribeRequest{
-					Request: &pb.SubscribeRequest_Poll{
-						Poll: &pb.Poll{},
-					},
-				}
-				if err := stream.Send(pollReq); err != nil {
-					return err
-				}
-			}
-		}
-	}
-}
-
-// LogSubscribeResponse logs update responses to stderr.
-func LogSubscribeResponse(response *pb.SubscribeResponse) error {
-	switch resp := response.Response.(type) {
-	case *pb.SubscribeResponse_Error:
-		return errors.New(resp.Error.Message)
-	case *pb.SubscribeResponse_SyncResponse:
-		if !resp.SyncResponse {
-			return errors.New("initial sync failed")
-		}
-	case *pb.SubscribeResponse_Update:
-		t := time.Unix(0, resp.Update.Timestamp).UTC()
-		prefix := StrPath(resp.Update.Prefix)
-		var target string
-		if t := resp.Update.Prefix.GetTarget(); t != "" {
-			target = "(" + t + ") "
-		}
-		for _, update := range resp.Update.Update {
-			fmt.Printf("[%s] %s%s = %s\n", t.Format(time.RFC3339Nano),
-				target,
-				path.Join(prefix, StrPath(update.Path)),
-				StrUpdateVal(update))
-		}
-		for _, del := range resp.Update.Delete {
-			fmt.Printf("[%s] %sDeleted %s\n", t.Format(time.RFC3339Nano),
-				target,
-				path.Join(prefix, StrPath(del)))
-		}
-	}
-	return nil
-}
diff --git a/forks/goarista/gnmi/operation_test.go b/forks/goarista/gnmi/operation_test.go
deleted file mode 100644
index fd575d10a..000000000
--- a/forks/goarista/gnmi/operation_test.go
+++ /dev/null
@@ -1,423 +0,0 @@
-// Copyright (c) 2017 Arista Networks, Inc.
-// Use of this source code is governed by the Apache License 2.0
-// that can be found in the COPYING file.
-
-package gnmi
-
-import (
-	"bytes"
-	"encoding/json"
-	"io/ioutil"
-	"os"
-	"testing"
-
-	"github.com/aristanetworks/goarista/test"
-	"github.com/golang/protobuf/proto"
-	"github.com/golang/protobuf/ptypes/any"
-
-	pb "github.com/openconfig/gnmi/proto/gnmi"
-)
-
-func TestNewSetRequest(t *testing.T) {
-	pathFoo := &pb.Path{
-		Element: []string{"foo"},
-		Elem:    []*pb.PathElem{{Name: "foo"}},
-	}
-	pathCli := &pb.Path{
-		Origin: "cli",
-	}
-	pathP4 := &pb.Path{
-		Origin: "p4_config",
-	}
-
-	p4FileContent := "p4_config test"
-	p4TestFile, err := ioutil.TempFile("", "p4TestFile")
-	if err != nil {
-		t.Errorf("cannot create test file for p4_config")
-	}
-	p4Filename := p4TestFile.Name()
-
-	defer os.Remove(p4Filename)
-
-	if _, err := p4TestFile.WriteString(p4FileContent); err != nil {
-		t.Errorf("cannot write test file for p4_config")
-	}
-	p4TestFile.Close()
-
-	testCases := map[string]struct {
-		setOps []*Operation
-		exp    pb.SetRequest
-	}{
-		"delete": {
-			setOps: []*Operation{{Type: "delete", Path: []string{"foo"}}},
-			exp:    pb.SetRequest{Delete: []*pb.Path{pathFoo}},
-		},
-		"update": {
-			setOps: []*Operation{{Type: "update", Path: []string{"foo"}, Val: "true"}},
-			exp: pb.SetRequest{
-				Update: []*pb.Update{{
-					Path: pathFoo,
-					Val: &pb.TypedValue{
-						Value: &pb.TypedValue_JsonIetfVal{JsonIetfVal: []byte("true")}},
-				}},
-			},
-		},
-		"replace": {
-			setOps: []*Operation{{Type: "replace", Path: []string{"foo"}, Val: "true"}},
-			exp: pb.SetRequest{
-				Replace: []*pb.Update{{
-					Path: pathFoo,
-					Val: &pb.TypedValue{
-						Value: &pb.TypedValue_JsonIetfVal{JsonIetfVal: []byte("true")}},
-				}},
-			},
-		},
-		"cli-replace": {
-			setOps: []*Operation{{Type: "replace", Origin: "cli",
-				Val: "hostname foo\nip routing"}},
-			exp: pb.SetRequest{
-				Replace: []*pb.Update{{
-					Path: pathCli,
-					Val: &pb.TypedValue{
-						Value: &pb.TypedValue_AsciiVal{AsciiVal: "hostname foo\nip routing"}},
-				}},
-			},
-		},
-		"p4_config": {
-			setOps: []*Operation{{Type: "replace", Origin: "p4_config",
-				Val: p4Filename}},
-			exp: pb.SetRequest{
-				Replace: []*pb.Update{{
-					Path: pathP4,
-					Val: &pb.TypedValue{
-						Value: &pb.TypedValue_ProtoBytes{ProtoBytes: []byte(p4FileContent)}},
-				}},
-			},
-		},
-		"target": {
-			setOps: []*Operation{{Type: "replace", Target: "JPE1234567",
-				Path: []string{"foo"}, Val: "true"}},
-			exp: pb.SetRequest{
-				Prefix: &pb.Path{Target: "JPE1234567"},
-				Replace: []*pb.Update{{
-					Path: pathFoo,
-					Val: &pb.TypedValue{
-						Value: &pb.TypedValue_JsonIetfVal{JsonIetfVal: []byte("true")}},
-				}},
-			},
-		},
-	}
-
-	for name, tc := range testCases {
-		t.Run(name, func(t *testing.T) {
-			got, err := newSetRequest(tc.setOps)
-			if err != nil {
-				t.Fatal(err)
-			}
-			if diff := test.Diff(tc.exp, *got); diff != "" {
-				t.Errorf("unexpected diff: %s", diff)
-			}
-		})
-	}
-}
-
-func TestStrUpdateVal(t *testing.T) {
-	anyBytes, err := proto.Marshal(&pb.ModelData{Name: "foobar"})
-	if err != nil {
-		t.Fatal(err)
-	}
-	anyMessage := &any.Any{TypeUrl: "gnmi/ModelData", Value: anyBytes}
-	anyString := proto.CompactTextString(anyMessage)
-
-	for name, tc := range map[string]struct {
-		update *pb.Update
-		exp    string
-	}{
-		"JSON Value": {
-			update: &pb.Update{
-				Value: &pb.Value{
-					Value: []byte(`{"foo":"bar"}`),
-					Type:  pb.Encoding_JSON}},
-			exp: `{"foo":"bar"}`,
-		},
-		"JSON_IETF Value": {
-			update: &pb.Update{
-				Value: &pb.Value{
-					Value: []byte(`{"foo":"bar"}`),
-					Type:  pb.Encoding_JSON_IETF}},
-			exp: `{"foo":"bar"}`,
-		},
-		"BYTES Value": {
-			update: &pb.Update{
-				Value: &pb.Value{
-					Value: []byte{0xde, 0xad},
-					Type:  pb.Encoding_BYTES}},
-			exp: "3q0=",
-		},
-		"PROTO Value": {
-			update: &pb.Update{
-				Value: &pb.Value{
-					Value: []byte{0xde, 0xad},
-					Type:  pb.Encoding_PROTO}},
-			exp: "3q0=",
-		},
-		"ASCII Value": {
-			update: &pb.Update{
-				Value: &pb.Value{
-					Value: []byte("foobar"),
-					Type:  pb.Encoding_ASCII}},
-			exp: "foobar",
-		},
-		"INVALID Value": {
-			update: &pb.Update{
-				Value: &pb.Value{
-					Value: []byte("foobar"),
-					Type:  pb.Encoding(42)}},
-			exp: "foobar",
-		},
-		"StringVal": {
-			update: &pb.Update{Val: &pb.TypedValue{
-				Value: &pb.TypedValue_StringVal{StringVal: "foobar"}}},
-			exp: "foobar",
-		},
-		"IntVal": {
-			update: &pb.Update{Val: &pb.TypedValue{
-				Value: &pb.TypedValue_IntVal{IntVal: -42}}},
-			exp: "-42",
-		},
-		"UintVal": {
-			update: &pb.Update{Val: &pb.TypedValue{
-				Value: &pb.TypedValue_UintVal{UintVal: 42}}},
-			exp: "42",
-		},
-		"BoolVal": {
-			update: &pb.Update{Val: &pb.TypedValue{
-				Value: &pb.TypedValue_BoolVal{BoolVal: true}}},
-			exp: "true",
-		},
-		"BytesVal": {
-			update: &pb.Update{Val: &pb.TypedValue{
-				Value: &pb.TypedValue_BytesVal{BytesVal: []byte{0xde, 0xad}}}},
-			exp: "3q0=",
-		},
-		"FloatVal": {
-			update: &pb.Update{Val: &pb.TypedValue{
-				Value: &pb.TypedValue_FloatVal{FloatVal: 3.14}}},
-			exp: "3.14",
-		},
-		"DecimalVal": {
-			update: &pb.Update{Val: &pb.TypedValue{
-				Value: &pb.TypedValue_DecimalVal{
-					DecimalVal: &pb.Decimal64{Digits: 314, Precision: 2},
-				}}},
-			exp: "3.14",
-		},
-		"LeafListVal": {
-			update: &pb.Update{Val: &pb.TypedValue{
-				Value: &pb.TypedValue_LeaflistVal{
-					LeaflistVal: &pb.ScalarArray{Element: []*pb.TypedValue{
-						{Value: &pb.TypedValue_BoolVal{BoolVal: true}},
-						{Value: &pb.TypedValue_AsciiVal{AsciiVal: "foobar"}},
-					}},
-				}}},
-			exp: "[true, foobar]",
-		},
-		"AnyVal": {
-			update: &pb.Update{Val: &pb.TypedValue{
-				Value: &pb.TypedValue_AnyVal{AnyVal: anyMessage}}},
-			exp: anyString,
-		},
-		"JsonVal": {
-			update: &pb.Update{Val: &pb.TypedValue{
-				Value: &pb.TypedValue_JsonVal{JsonVal: []byte(`{"foo":"bar"}`)}}},
-			exp: `{"foo":"bar"}`,
-		},
-		"JsonVal_complex": {
-			update: &pb.Update{Val: &pb.TypedValue{
-				Value: &pb.TypedValue_JsonVal{JsonVal: []byte(`{"foo":"bar","baz":"qux"}`)}}},
-			exp: `{
-  "foo": "bar",
-  "baz": "qux"
-}`,
-		},
-		"JsonIetfVal": {
-			update: &pb.Update{Val: &pb.TypedValue{
-				Value: &pb.TypedValue_JsonIetfVal{JsonIetfVal: []byte(`{"foo":"bar"}`)}}},
-			exp: `{"foo":"bar"}`,
-		},
-		"AsciiVal": {
-			update: &pb.Update{Val: &pb.TypedValue{
-				Value: &pb.TypedValue_AsciiVal{AsciiVal: "foobar"}}},
-			exp: "foobar",
-		},
-		"ProtoBytes": {
-			update: &pb.Update{Val: &pb.TypedValue{
-				Value: &pb.TypedValue_ProtoBytes{ProtoBytes: anyBytes}}},
-			exp: "CgZmb29iYXI=",
-		},
-	} {
-		t.Run(name, func(t *testing.T) {
-			got := StrUpdateVal(tc.update)
-			if got != tc.exp {
-				t.Errorf("Expected: %q Got: %q", tc.exp, got)
-			}
-		})
-	}
-}
-
-func TestTypedValue(t *testing.T) {
-	for tname, tcase := range map[string]struct {
-		in  interface{}
-		exp *pb.TypedValue
-	}{
-		"string": {
-			in:  "foo",
-			exp: &pb.TypedValue{Value: &pb.TypedValue_StringVal{StringVal: "foo"}},
-		},
-		"int": {
-			in:  42,
-			exp: &pb.TypedValue{Value: &pb.TypedValue_IntVal{IntVal: 42}},
-		},
-		"int64": {
-			in:  int64(42),
-			exp: &pb.TypedValue{Value: &pb.TypedValue_IntVal{IntVal: 42}},
-		},
-		"uint": {
-			in:  uint(42),
-			exp: &pb.TypedValue{Value: &pb.TypedValue_UintVal{UintVal: 42}},
-		},
-		"bool": {
-			in:  true,
-			exp: &pb.TypedValue{Value: &pb.TypedValue_BoolVal{BoolVal: true}},
-		},
-		"slice": {
-			in: []interface{}{"foo", 1, uint(2), true},
-			exp: &pb.TypedValue{Value: &pb.TypedValue_LeaflistVal{LeaflistVal: &pb.ScalarArray{
-				Element: []*pb.TypedValue{
-					{Value: &pb.TypedValue_StringVal{StringVal: "foo"}},
-					{Value: &pb.TypedValue_IntVal{IntVal: 1}},
-					{Value: &pb.TypedValue_UintVal{UintVal: 2}},
-					{Value: &pb.TypedValue_BoolVal{BoolVal: true}},
-				}}}},
-		},
-	} {
-		t.Run(tname, func(t *testing.T) {
-			if got := TypedValue(tcase.in); !test.DeepEqual(got, tcase.exp) {
-				t.Errorf("Expected: %q Got: %q", tcase.exp, got)
-			}
-		})
-	}
-}
-
-func TestExtractJSON(t *testing.T) {
-	jsonFile, err := ioutil.TempFile("", "extractJSON")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer os.Remove(jsonFile.Name())
-	if _, err := jsonFile.Write([]byte(`"jsonFile"`)); err != nil {
-		jsonFile.Close()
-		t.Fatal(err)
-	}
-	if err := jsonFile.Close(); err != nil {
-		t.Fatal(err)
-	}
-
-	for val, exp := range map[string][]byte{
-		jsonFile.Name(): []byte(`"jsonFile"`),
-		"foobar":        []byte(`"foobar"`),
-		`"foobar"`:      []byte(`"foobar"`),
-		"Val: true":     []byte(`"Val: true"`),
-		"host42":        []byte(`"host42"`),
-		"42":            []byte("42"),
-		"-123.43":       []byte("-123.43"),
-		"0xFFFF":        []byte("0xFFFF"),
-		// Int larger than can fit in 32 bits should be quoted
-		"0x8000000000":  []byte(`"0x8000000000"`),
-		"-0x8000000000": []byte(`"-0x8000000000"`),
-		"true":          []byte("true"),
-		"false":         []byte("false"),
-		"null":          []byte("null"),
-		"{true: 42}":    []byte("{true: 42}"),
-		"[]":            []byte("[]"),
-	} {
-		t.Run(val, func(t *testing.T) {
-			got := extractJSON(val)
-			if !bytes.Equal(exp, got) {
-				t.Errorf("Unexpected diff. Expected: %q Got: %q", exp, got)
-			}
-		})
-	}
-}
-
-func TestExtractValue(t *testing.T) {
-	cases := []struct {
-		in  *pb.Update
-		exp interface{}
-	}{{
-		in: &pb.Update{Val: &pb.TypedValue{
-			Value: &pb.TypedValue_StringVal{StringVal: "foo"}}},
-		exp: "foo",
-	}, {
-		in: &pb.Update{Val: &pb.TypedValue{
-			Value: &pb.TypedValue_IntVal{IntVal: 123}}},
-		exp: int64(123),
-	}, {
-		in: &pb.Update{Val: &pb.TypedValue{
-			Value: &pb.TypedValue_UintVal{UintVal: 123}}},
-		exp: uint64(123),
-	}, {
-		in: &pb.Update{Val: &pb.TypedValue{
-			Value: &pb.TypedValue_BoolVal{BoolVal: true}}},
-		exp: true,
-	}, {
-		in: &pb.Update{Val: &pb.TypedValue{
-			Value: &pb.TypedValue_BytesVal{BytesVal: []byte{0xde, 0xad}}}},
-		exp: []byte{0xde, 0xad},
-	}, {
-		in: &pb.Update{Val: &pb.TypedValue{
-			Value: &pb.TypedValue_FloatVal{FloatVal: -12.34}}},
-		exp: float32(-12.34),
-	}, {
-		in: &pb.Update{Val: &pb.TypedValue{
-			Value: &pb.TypedValue_DecimalVal{DecimalVal: &pb.Decimal64{
-				Digits: -1234, Precision: 2}}}},
-		exp: &pb.Decimal64{Digits: -1234, Precision: 2},
-	}, {
-		in: &pb.Update{Val: &pb.TypedValue{
-			Value: &pb.TypedValue_LeaflistVal{LeaflistVal: &pb.ScalarArray{
-				Element: []*pb.TypedValue{
-					{Value: &pb.TypedValue_StringVal{StringVal: "foo"}},
-					{Value: &pb.TypedValue_IntVal{IntVal: 123}}}}}}},
-		exp: []interface{}{"foo", int64(123)},
-	}, {
-		in: &pb.Update{Val: &pb.TypedValue{
-			Value: &pb.TypedValue_JsonVal{JsonVal: []byte(`12.34`)}}},
-		exp: json.Number("12.34"),
-	}, {
-		in: &pb.Update{Val: &pb.TypedValue{
-			Value: &pb.TypedValue_JsonVal{JsonVal: []byte(`[12.34, 123, "foo"]`)}}},
-		exp: []interface{}{json.Number("12.34"), json.Number("123"), "foo"},
-	}, {
-		in: &pb.Update{Val: &pb.TypedValue{
-			Value: &pb.TypedValue_JsonVal{JsonVal: []byte(`{"foo":"bar"}`)}}},
-		exp: map[string]interface{}{"foo": "bar"},
-	}, {
-		in: &pb.Update{Val: &pb.TypedValue{
-			Value: &pb.TypedValue_JsonVal{JsonVal: []byte(`{"foo":45.67}`)}}},
-		exp: map[string]interface{}{"foo": json.Number("45.67")},
-	}, {
-		in: &pb.Update{Val: &pb.TypedValue{
-			Value: &pb.TypedValue_JsonIetfVal{JsonIetfVal: []byte(`{"foo":"bar"}`)}}},
-		exp: map[string]interface{}{"foo": "bar"},
-	}}
-	for _, tc := range cases {
-		out, err := ExtractValue(tc.in)
-		if err != nil {
-			t.Errorf(err.Error())
-		}
-		if !test.DeepEqual(tc.exp, out) {
-			t.Errorf("Extracted value is incorrect. Expected %+v, got %+v", tc.exp, out)
-		}
-	}
-}
diff --git a/forks/goarista/gnmi/path.go b/forks/goarista/gnmi/path.go
deleted file mode 100644
index 00280a8fc..000000000
--- a/forks/goarista/gnmi/path.go
+++ /dev/null
@@ -1,251 +0,0 @@
-// Copyright (c) 2017 Arista Networks, Inc.
-// Use of this source code is governed by the Apache License 2.0
-// that can be found in the COPYING file.
-
-package gnmi
-
-import (
-	"fmt"
-	"sort"
-	"strings"
-
-	pb "github.com/openconfig/gnmi/proto/gnmi"
-)
-
-// nextTokenIndex returns the end index of the first token.
-func nextTokenIndex(path string) int {
-	var inBrackets bool
-	var escape bool
-	for i, c := range path {
-		switch c {
-		case '[':
-			inBrackets = true
-			escape = false
-		case ']':
-			if !escape {
-				inBrackets = false
-			}
-			escape = false
-		case '\\':
-			escape = !escape
-		case '/':
-			if !inBrackets && !escape {
-				return i
-			}
-			escape = false
-		default:
-			escape = false
-		}
-	}
-	return len(path)
-}
-
-// SplitPath splits a gnmi path according to the spec. See
-// https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-path-conventions.md
-// No validation is done. Behavior is undefined if path is an invalid
-// gnmi path. TODO: Do validation?
-func SplitPath(path string) []string {
-	var result []string
-	if len(path) > 0 && path[0] == '/' {
-		path = path[1:]
-	}
-	for len(path) > 0 {
-		i := nextTokenIndex(path)
-		result = append(result, path[:i])
-		path = path[i:]
-		if len(path) > 0 && path[0] == '/' {
-			path = path[1:]
-		}
-	}
-	return result
-}
-
-// SplitPaths splits multiple gnmi paths
-func SplitPaths(paths []string) [][]string {
-	out := make([][]string, len(paths))
-	for i, path := range paths {
-		out[i] = SplitPath(path)
-	}
-	return out
-}
-
-// StrPath builds a human-readable form of a gnmi path.
-// e.g. /a/b/c[e=f]
-func StrPath(path *pb.Path) string {
-	if path == nil {
-		return "/"
-	} else if len(path.Elem) != 0 {
-		return strPathV04(path)
-	} else if len(path.Element) != 0 {
-		return strPathV03(path)
-	}
-	return "/"
-}
-
-// strPathV04 handles the v0.4 gnmi and later path.Elem member.
-func strPathV04(path *pb.Path) string {
-	b := &strings.Builder{}
-	for _, elm := range path.Elem {
-		b.WriteRune('/')
-		writeSafeString(b, elm.Name, '/')
-		if len(elm.Key) > 0 {
-			// Sort the keys so that they print in a conistent
-			// order. We don't have the YANG AST information, so the
-			// best we can do is sort them alphabetically.
-			keys := make([]string, 0, len(elm.Key))
-			for k := range elm.Key {
-				keys = append(keys, k)
-			}
-			sort.Strings(keys)
-			for _, k := range keys {
-				b.WriteRune('[')
-				b.WriteString(k)
-				b.WriteRune('=')
-				writeSafeString(b, elm.Key[k], ']')
-				b.WriteRune(']')
-			}
-		}
-	}
-	return b.String()
-}
-
-// strPathV03 handles the v0.3 gnmi and earlier path.Element member.
-func strPathV03(path *pb.Path) string {
-	return "/" + strings.Join(path.Element, "/")
-}
-
-// upgradePath modernizes a Path by translating the contents of the Element field to Elem
-func upgradePath(path *pb.Path) *pb.Path {
-	if len(path.Elem) == 0 {
-		var elems []*pb.PathElem
-		for _, element := range path.Element {
-			n, keys, _ := parseElement(element)
-			elems = append(elems, &pb.PathElem{Name: n, Key: keys})
-		}
-		path.Elem = elems
-		path.Element = nil
-	}
-	return path
-}
-
-// JoinPaths joins multiple gnmi paths and returns a string representation
-func JoinPaths(paths ...*pb.Path) *pb.Path {
-	var elems []*pb.PathElem
-	for _, path := range paths {
-		path = upgradePath(path)
-		elems = append(elems, path.Elem...)
-	}
-	return &pb.Path{Elem: elems}
-}
-
-func writeSafeString(b *strings.Builder, s string, esc rune) {
-	for _, c := range s {
-		if c == esc || c == '\\' {
-			b.WriteRune('\\')
-		}
-		b.WriteRune(c)
-	}
-}
-
-// ParseGNMIElements builds up a gnmi path, from user-supplied text
-func ParseGNMIElements(elms []string) (*pb.Path, error) {
-	var parsed []*pb.PathElem
-	for _, e := range elms {
-		n, keys, err := parseElement(e)
-		if err != nil {
-			return nil, err
-		}
-		parsed = append(parsed, &pb.PathElem{Name: n, Key: keys})
-	}
-	return &pb.Path{
-		Element: elms, // Backwards compatibility with pre-v0.4 gnmi
-		Elem:    parsed,
-	}, nil
-}
-
-// parseElement parses a path element, according to the gNMI specification. See
-// https://github.com/openconfig/reference/blame/master/rpc/gnmi/gnmi-path-conventions.md
-//
-// It returns the first string (the current element name), and an optional map of key name
-// value pairs.
-func parseElement(pathElement string) (string, map[string]string, error) {
-	// First check if there are any keys, i.e. do we have at least one '[' in the element
-	name, keyStart := findUnescaped(pathElement, '[')
-	if keyStart < 0 {
-		return name, nil, nil
-	}
-
-	// Error if there is no element name or if the "[" is at the beginning of the path element
-	if len(name) == 0 {
-		return "", nil, fmt.Errorf("failed to find element name in %q", pathElement)
-	}
-
-	// Look at the keys now.
-	keys := make(map[string]string)
-	keyPart := pathElement[keyStart:]
-	for keyPart != "" {
-		k, v, nextKey, err := parseKey(keyPart)
-		if err != nil {
-			return "", nil, err
-		}
-		keys[k] = v
-		keyPart = nextKey
-	}
-	return name, keys, nil
-}
-
-// parseKey returns the key name, key value and the remaining string to be parsed,
-func parseKey(s string) (string, string, string, error) {
-	if s[0] != '[' {
-		return "", "", "", fmt.Errorf("failed to find opening '[' in %q", s)
-	}
-	k, iEq := findUnescaped(s[1:], '=')
-	if iEq < 0 {
-		return "", "", "", fmt.Errorf("failed to find '=' in %q", s)
-	}
-	if k == "" {
-		return "", "", "", fmt.Errorf("failed to find key name in %q", s)
-	}
-
-	rhs := s[1+iEq+1:]
-	v, iClosBr := findUnescaped(rhs, ']')
-	if iClosBr < 0 {
-		return "", "", "", fmt.Errorf("failed to find ']' in %q", s)
-	}
-	if v == "" {
-		return "", "", "", fmt.Errorf("failed to find key value in %q", s)
-	}
-
-	next := rhs[iClosBr+1:]
-	return k, v, next, nil
-}
-
-// findUnescaped will return the index of the first unescaped match of 'find', and the unescaped
-// string leading up to it.
-func findUnescaped(s string, find byte) (string, int) {
-	// Take a fast track if there are no escape sequences
-	if strings.IndexByte(s, '\\') == -1 {
-		i := strings.IndexByte(s, find)
-		if i < 0 {
-			return s, -1
-		}
-		return s[:i], i
-	}
-
-	// Find the first match, taking care of escaped chars.
-	var b strings.Builder
-	var i int
-	len := len(s)
-	for i = 0; i < len; {
-		ch := s[i]
-		if ch == find {
-			return b.String(), i
-		} else if ch == '\\' && i < len-1 {
-			i++
-			ch = s[i]
-		}
-		b.WriteByte(ch)
-		i++
-	}
-	return b.String(), -1
-}
diff --git a/forks/goarista/gnmi/path_test.go b/forks/goarista/gnmi/path_test.go
deleted file mode 100644
index 27318b65c..000000000
--- a/forks/goarista/gnmi/path_test.go
+++ /dev/null
@@ -1,308 +0,0 @@
-// Copyright (c) 2017 Arista Networks, Inc.
-// Use of this source code is governed by the Apache License 2.0
-// that can be found in the COPYING file.
-
-package gnmi
-
-import (
-	"fmt"
-	"testing"
-
-	"github.com/aristanetworks/goarista/test"
-
-	pb "github.com/openconfig/gnmi/proto/gnmi"
-)
-
-func p(s ...string) []string {
-	return s
-}
-
-func TestSplitPath(t *testing.T) {
-	for i, tc := range []struct {
-		in  string
-		exp []string
-	}{{
-		in:  "/foo/bar",
-		exp: p("foo", "bar"),
-	}, {
-		in:  "/foo/bar/",
-		exp: p("foo", "bar"),
-	}, {
-		in:  "//foo//bar//",
-		exp: p("", "foo", "", "bar", ""),
-	}, {
-		in:  "/foo[name=///]/bar",
-		exp: p("foo[name=///]", "bar"),
-	}, {
-		in:  `/foo[name=[\\\]/]/bar`,
-		exp: p(`foo[name=[\\\]/]`, "bar"),
-	}, {
-		in:  `/foo[name=[\\]/bar`,
-		exp: p(`foo[name=[\\]`, "bar"),
-	}, {
-		in:  "/foo[a=1][b=2]/bar",
-		exp: p("foo[a=1][b=2]", "bar"),
-	}, {
-		in:  "/foo[a=1\\]2][b=2]/bar",
-		exp: p("foo[a=1\\]2][b=2]", "bar"),
-	}, {
-		in:  "/foo[a=1][b=2]/bar\\baz",
-		exp: p("foo[a=1][b=2]", "bar\\baz"),
-	}} {
-		got := SplitPath(tc.in)
-		if !test.DeepEqual(tc.exp, got) {
-			t.Errorf("[%d] unexpect split for %q. Expected: %v, Got: %v",
-				i, tc.in, tc.exp, got)
-		}
-	}
-}
-
-func TestStrPath(t *testing.T) {
-	for i, tc := range []struct {
-		path string
-	}{{
-		path: "/",
-	}, {
-		path: "/foo/bar",
-	}, {
-		path: "/foo[name=a]/bar",
-	}, {
-		path: "/foo[a=1][b=2]/bar",
-	}, {
-		path: "/foo[a=1\\]2][b=2]/bar",
-	}, {
-		path: "/foo[a=1][b=2]/bar\\/baz",
-	}} {
-		sElms := SplitPath(tc.path)
-		pbPath, err := ParseGNMIElements(sElms)
-		if err != nil {
-			t.Errorf("failed to parse %s: %s", sElms, err)
-		}
-		s := StrPath(pbPath)
-		if !test.DeepEqual(tc.path, s) {
-			t.Errorf("[%d] want %s, got %s", i, tc.path, s)
-		}
-	}
-}
-
-func TestStrPathBackwardsCompat(t *testing.T) {
-	for i, tc := range []struct {
-		path *pb.Path
-		str  string
-	}{{
-		path: &pb.Path{
-			Element: p("foo[a=1][b=2]", "bar"),
-		},
-		str: "/foo[a=1][b=2]/bar",
-	}} {
-		got := StrPath(tc.path)
-		if got != tc.str {
-			t.Errorf("[%d] want %q, got %q", i, tc.str, got)
-		}
-	}
-}
-
-func TestParseElement(t *testing.T) {
-	// test cases
-	cases := []struct {
-		// name is the name of the test useful if you want to run a single test
-		// from the command line -run TestParseElement/<name>
-		name string
-		// in is the path element to be parsed
-		in string
-		// fieldName is field name (YANG node name) expected to be parsed from the path element.
-		// Normally this is simply the path element, or if the path element contains keys this is
-		// the text before the first [
-		fieldName string
-		// keys is a map of the expected key value pairs from within the []s in the
-		// `path element.
-		//
-		// For example prefix[ip-prefix=10.0.0.0/24][masklength-range=26..28]
-		// fieldName would be "prefix"
-		// keys would be {"ip-prefix": "10.0.0.0/24", "masklength-range": "26..28"}
-		keys map[string]string
-		// expectedError is the exact error we expect.
-		expectedError error
-	}{{
-		name:      "no_elms",
-		in:        "hello",
-		fieldName: "hello",
-	}, {
-		name:          "single_open",
-		in:            "[",
-		expectedError: fmt.Errorf("failed to find element name in %q", "["),
-	}, {
-		name:          "no_equal_no_close",
-		in:            "hello[there",
-		expectedError: fmt.Errorf("failed to find '=' in %q", "[there"),
-	}, {
-		name:          "no_equals",
-		in:            "hello[there]",
-		expectedError: fmt.Errorf("failed to find '=' in %q", "[there]"),
-	}, {
-		name:          "no_left_side",
-		in:            "hello[=there]",
-		expectedError: fmt.Errorf("failed to find key name in %q", "[=there]"),
-	}, {
-		name:          "no_right_side",
-		in:            "hello[there=]",
-		expectedError: fmt.Errorf("failed to find key value in %q", "[there=]"),
-	}, {
-		name:          "hanging_escape",
-		in:            "hello[there\\",
-		expectedError: fmt.Errorf("failed to find '=' in %q", "[there\\"),
-	}, {
-		name:      "single_name_value",
-		in:        "hello[there=where]",
-		fieldName: "hello",
-		keys:      map[string]string{"there": "where"},
-	}, {
-		name:      "single_value_with=",
-		in:        "hello[there=whe=r=e]",
-		fieldName: "hello",
-		keys:      map[string]string{"there": "whe=r=e"},
-	}, {
-		name:      "single_value_with=_and_escaped_]",
-		in:        `hello[there=whe=\]r=e]`,
-		fieldName: "hello",
-		keys:      map[string]string{"there": `whe=]r=e`},
-	}, {
-		name:      "single_value_with[",
-		in:        "hello[there=w[[here]",
-		fieldName: "hello",
-		keys:      map[string]string{"there": "w[[here"},
-	}, {
-		name:          "value_single_open",
-		in:            "hello[first=value][",
-		expectedError: fmt.Errorf("failed to find '=' in %q", "["),
-	}, {
-		name:          "value_no_close",
-		in:            "hello[there=where][somename",
-		expectedError: fmt.Errorf("failed to find '=' in %q", "[somename"),
-	}, {
-		name:          "value_no_equals",
-		in:            "hello[there=where][somename]",
-		expectedError: fmt.Errorf("failed to find '=' in %q", "[somename]"),
-	}, {
-		name:          "no_left_side",
-		in:            "hello[there=where][=somevalue]",
-		expectedError: fmt.Errorf("failed to find key name in %q", "[=somevalue]"),
-	}, {
-		name:          "no_right_side",
-		in:            "hello[there=where][somename=]",
-		expectedError: fmt.Errorf("failed to find key value in %q", "[somename=]"),
-	}, {
-		name:      "two_name_values",
-		in:        "hello[there=where][somename=somevalue]",
-		fieldName: "hello",
-		keys:      map[string]string{"there": "where", "somename": "somevalue"},
-	}, {
-		name:      "three_name_values",
-		in:        "hello[there=where][somename=somevalue][anothername=value]",
-		fieldName: "hello",
-		keys: map[string]string{"there": "where", "somename": "somevalue",
-			"anothername": "value"},
-	}, {
-		name:      "aserisk_value",
-		in:        "hello[there=*][somename=somevalue][anothername=value]",
-		fieldName: "hello",
-		keys: map[string]string{"there": "*", "somename": "somevalue",
-			"anothername": "value"},
-	}}
-
-	for _, tc := range cases {
-		t.Run(tc.name, func(t *testing.T) {
-			fieldName, keys, err := parseElement(tc.in)
-			if !test.DeepEqual(tc.expectedError, err) {
-				t.Fatalf("[%s] expected err %#v, got %#v", tc.name, tc.expectedError, err)
-			}
-			if !test.DeepEqual(tc.keys, keys) {
-				t.Fatalf("[%s] expected output %#v, got %#v", tc.name, tc.keys, keys)
-			}
-			if tc.fieldName != fieldName {
-				t.Fatalf("[%s] expected field name %s, got %s", tc.name, tc.fieldName, fieldName)
-			}
-		})
-	}
-}
-
-func strToPath(pathStr string) *pb.Path {
-	splitPath := SplitPath(pathStr)
-	path, _ := ParseGNMIElements(splitPath)
-	path.Element = nil
-	return path
-}
-
-func strsToPaths(pathStrs []string) []*pb.Path {
-	var paths []*pb.Path
-	for _, splitPath := range SplitPaths(pathStrs) {
-		path, _ := ParseGNMIElements(splitPath)
-		path.Element = nil
-		paths = append(paths, path)
-	}
-	return paths
-}
-
-func TestJoinPath(t *testing.T) {
-	cases := []struct {
-		paths []*pb.Path
-		exp   string
-	}{{
-		paths: strsToPaths([]string{"/foo/bar", "/baz/qux"}),
-		exp:   "/foo/bar/baz/qux",
-	},
-		{
-			paths: strsToPaths([]string{
-				"/foo/bar[somekey=someval][otherkey=otherval]", "/baz/qux"}),
-			exp: "/foo/bar[otherkey=otherval][somekey=someval]/baz/qux",
-		},
-		{
-			paths: strsToPaths([]string{
-				"/foo/bar[somekey=someval][otherkey=otherval]",
-				"/baz/qux[somekey=someval][otherkey=otherval]"}),
-			exp: "/foo/bar[otherkey=otherval][somekey=someval]/" +
-				"baz/qux[otherkey=otherval][somekey=someval]",
-		},
-		{
-			paths: []*pb.Path{
-				{Element: []string{"foo", "bar[somekey=someval][otherkey=otherval]"}},
-				{Element: []string{"baz", "qux[somekey=someval][otherkey=otherval]"}}},
-			exp: "/foo/bar[somekey=someval][otherkey=otherval]/" +
-				"baz/qux[somekey=someval][otherkey=otherval]",
-		},
-	}
-
-	for _, tc := range cases {
-		got := JoinPaths(tc.paths...)
-		exp := strToPath(tc.exp)
-		exp.Element = nil
-		if !test.DeepEqual(got, exp) {
-			t.Fatalf("ERROR!\n Got: %s,\n Want %s\n", got, exp)
-		}
-	}
-}
-
-func BenchmarkPathElementToSigleElementName(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		_, _, _ = parseElement("hello")
-	}
-}
-
-func BenchmarkPathElementTwoKeys(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		_, _, _ = parseElement("hello[hello=world][bye=moon]")
-	}
-}
-
-func BenchmarkPathElementBadKeys(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		_, _, _ = parseElement("hello[hello=world][byemoon]")
-	}
-}
-
-func BenchmarkPathElementMaxKeys(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		_, _, _ = parseElement("hello[name=firstName][name=secondName][name=thirdName]" +
-			"[name=fourthName][name=fifthName][name=sixthName]")
-	}
-}
diff --git a/forks/google/gnmi/model.go b/forks/google/gnmi/model.go
deleted file mode 100644
index cf704a545..000000000
--- a/forks/google/gnmi/model.go
+++ /dev/null
@@ -1,79 +0,0 @@
-/* Copyright 2017 Google Inc.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    https://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 gnmi
-
-import (
-	"errors"
-	"fmt"
-	"reflect"
-	"sort"
-
-	"github.com/openconfig/goyang/pkg/yang"
-	"github.com/openconfig/ygot/ygot"
-	"github.com/openconfig/ygot/ytypes"
-
-	pb "github.com/openconfig/gnmi/proto/gnmi"
-)
-
-// JSONUnmarshaler is the signature of the Unmarshal() function in the GoStruct code generated by openconfig ygot library.
-type JSONUnmarshaler func([]byte, ygot.GoStruct, ...ytypes.UnmarshalOpt) error
-
-// GoStructEnumData is the data type to maintain GoStruct enum type.
-type GoStructEnumData map[string]map[int64]ygot.EnumDefinition
-
-// Model contains the model data and GoStruct information for the device to config.
-type Model struct {
-	modelData       []*pb.ModelData
-	structRootType  reflect.Type
-	schemaTreeRoot  *yang.Entry
-	jsonUnmarshaler JSONUnmarshaler
-	enumData        GoStructEnumData
-}
-
-// NewModel returns an instance of Model struct.
-func NewModel(m []*pb.ModelData, t reflect.Type, r *yang.Entry, f JSONUnmarshaler, e GoStructEnumData) *Model {
-	return &Model{
-		modelData:       m,
-		structRootType:  t,
-		schemaTreeRoot:  r,
-		jsonUnmarshaler: f,
-		enumData:        e,
-	}
-}
-
-func (m *Model) newRootValue() interface{} {
-	return reflect.New(m.structRootType.Elem()).Interface()
-}
-
-// NewConfigStruct creates a ValidatedGoStruct of this model from jsonConfig. If jsonConfig is nil, creates an empty GoStruct.
-func (m *Model) NewConfigStruct(jsonConfig []byte) (ygot.ValidatedGoStruct, error) {
-	rootStruct, ok := m.newRootValue().(ygot.ValidatedGoStruct)
-	if !ok {
-		return nil, errors.New("root node is not a ygot.ValidatedGoStruct")
-	}
-
-	return rootStruct, nil
-}
-
-// SupportedModels returns a list of supported models.
-func (m *Model) SupportedModels() []string {
-	mDesc := make([]string, len(m.modelData))
-	for i, m := range m.modelData {
-		mDesc[i] = fmt.Sprintf("%s %s", m.Name, m.Version)
-	}
-	sort.Strings(mDesc)
-	return mDesc
-}
diff --git a/forks/google/gnmi/server.go b/forks/google/gnmi/server.go
deleted file mode 100644
index 2f9416149..000000000
--- a/forks/google/gnmi/server.go
+++ /dev/null
@@ -1,602 +0,0 @@
-/* Copyright 2017 Google Inc.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    https://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 gnmi implements a gnmi server to mock a device with YANG models.
-package gnmi
-
-import (
-	"bytes"
-	"compress/gzip"
-	"encoding/json"
-	"fmt"
-	"io/ioutil"
-	"reflect"
-	"strconv"
-	"sync"
-	"time"
-
-	"golang.org/x/net/context"
-	"google.golang.org/grpc/codes"
-	"google.golang.org/grpc/status"
-
-	"github.com/golang/protobuf/proto"
-	"github.com/openconfig/gnmi/value"
-	"github.com/openconfig/ygot/util"
-	"github.com/openconfig/ygot/ygot"
-	"github.com/openconfig/ygot/ytypes"
-	log "github.com/sirupsen/logrus"
-
-	dpb "github.com/golang/protobuf/protoc-gen-go/descriptor"
-	pb "github.com/openconfig/gnmi/proto/gnmi"
-)
-
-// ConfigCallback is the signature of the function to apply a validated config to the physical device.
-type ConfigCallback func(ygot.ValidatedGoStruct) error
-
-var (
-	pbRootPath         = &pb.Path{}
-	supportedEncodings = []pb.Encoding{pb.Encoding_PROTO, pb.Encoding_JSON_IETF, pb.Encoding_JSON}
-)
-
-// Server struct maintains the data structure for device config and implements the interface of gnmi server.
-// It supports Capabilities, Get, and Set APIs.
-// Typical usage:
-//	g := grpc.NewServer()
-//	s, err := Server.NewServer(model, config, callback)
-//	pb.NewServer(g, s)
-//	reflection.Register(g)
-//	listen, err := net.Listen("tcp", ":8080")
-//	g.Serve(listen)
-//
-// For a real device, apply the config changes to the hardware in the callback function.
-// Arguments:
-//		newConfig: new root config to be applied on the device.
-
-type Server struct {
-	model    *Model
-	callback ConfigCallback
-
-	config ygot.ValidatedGoStruct
-	mu     sync.RWMutex // mu is the RW lock to protect the access to config
-}
-
-// NewServer creates an instance of Server with given json config.
-func NewServer(model *Model, config []byte, callback ConfigCallback) (*Server, error) {
-	rootStruct, err := model.NewConfigStruct(config)
-	if err != nil {
-		return nil, err
-	}
-	s := &Server{
-		model:    model,
-		config:   rootStruct,
-		callback: callback,
-	}
-	if config != nil && s.callback != nil {
-		if err := s.callback(rootStruct); err != nil {
-			return nil, err
-		}
-	}
-	return s, nil
-}
-
-// checkEncodingAndModel checks whether encoding and models are supported by the server. Return error if anything is unsupported.
-func (s *Server) checkEncodingAndModel(encoding pb.Encoding, models []*pb.ModelData) error {
-	hasSupportedEncoding := false
-	for _, supportedEncoding := range supportedEncodings {
-		if encoding == supportedEncoding {
-			hasSupportedEncoding = true
-			break
-		}
-	}
-	if !hasSupportedEncoding {
-		return fmt.Errorf("unsupported encoding: %s", pb.Encoding_name[int32(encoding)])
-	}
-	for _, m := range models {
-		isSupported := false
-		for _, supportedModel := range s.model.modelData {
-			if reflect.DeepEqual(m, supportedModel) {
-				isSupported = true
-				break
-			}
-		}
-		if !isSupported {
-			return fmt.Errorf("unsupported model: %v", m)
-		}
-	}
-	return nil
-}
-
-// doDelete deletes the path from the json tree if the path exists. If success,
-// it calls the callback function to apply the change to the device hardware.
-func (s *Server) doDelete(jsonTree map[string]interface{}, prefix, path *pb.Path) (*pb.UpdateResult, error) {
-	// Update json tree of the device config
-	var curNode interface{} = jsonTree
-	pathDeleted := false
-	fullPath := gnmiFullPath(prefix, path)
-	schema := s.model.schemaTreeRoot
-	for i, elem := range fullPath.Elem { // Delete sub-tree or leaf node.
-		node, ok := curNode.(map[string]interface{})
-		if !ok {
-			break
-		}
-
-		// Delete node
-		if i == len(fullPath.Elem)-1 {
-			if elem.GetKey() == nil {
-				delete(node, elem.Name)
-				pathDeleted = true
-				break
-			}
-			pathDeleted = deleteKeyedListEntry(node, elem)
-			break
-		}
-
-		if curNode, schema = getChildNode(node, schema, elem, false); curNode == nil {
-			break
-		}
-	}
-	if reflect.DeepEqual(fullPath, pbRootPath) { // Delete root
-		for k := range jsonTree {
-			delete(jsonTree, k)
-		}
-	}
-
-	// Apply the validated operation to the config tree and device.
-	if pathDeleted {
-		newConfig, err := s.toGoStruct(jsonTree)
-		if err != nil {
-			return nil, status.Error(codes.Internal, err.Error())
-		}
-		if s.callback != nil {
-			if applyErr := s.callback(newConfig); applyErr != nil {
-				if rollbackErr := s.callback(s.config); rollbackErr != nil {
-					return nil, status.Errorf(codes.Internal, "error in rollback the failed operation (%v): %v", applyErr, rollbackErr)
-				}
-				return nil, status.Errorf(codes.Aborted, "error in applying operation to device: %v", applyErr)
-			}
-		}
-	}
-	return &pb.UpdateResult{
-		Path: path,
-		Op:   pb.UpdateResult_DELETE,
-	}, nil
-}
-
-// doReplaceOrUpdate validates the replace or update operation to be applied to
-// the device, modifies the json tree of the config struct, then calls the
-// callback function to apply the operation to the device hardware.
-func (s *Server) doReplaceOrUpdate(jsonTree map[string]interface{}, op pb.UpdateResult_Operation, prefix, path *pb.Path, val *pb.TypedValue) (*pb.UpdateResult, error) {
-	// Validate the operation.
-	fullPath := gnmiFullPath(prefix, path)
-	emptyNode, _, err := ytypes.GetOrCreateNode(s.model.schemaTreeRoot, s.model.newRootValue(), fullPath)
-	if err != nil {
-		return nil, status.Errorf(codes.NotFound, "path %v is not found in the config structure: %v", fullPath, err)
-	}
-	var nodeVal interface{}
-	nodeStruct, ok := emptyNode.(ygot.ValidatedGoStruct)
-	if ok {
-		if err := s.model.jsonUnmarshaler(val.GetJsonIetfVal(), nodeStruct); err != nil {
-			return nil, status.Errorf(codes.InvalidArgument, "unmarshaling json data to config struct fails: %v", err)
-		}
-		if err := nodeStruct.Validate(); err != nil {
-			return nil, status.Errorf(codes.InvalidArgument, "config data validation fails: %v", err)
-		}
-		var err error
-		if nodeVal, err = ygot.ConstructIETFJSON(nodeStruct, &ygot.RFC7951JSONConfig{}); err != nil {
-			msg := fmt.Sprintf("error in constructing IETF JSON tree from config struct: %v", err)
-			log.Error(msg)
-			return nil, status.Error(codes.Internal, msg)
-		}
-	} else {
-		var err error
-		if nodeVal, err = value.ToScalar(val); err != nil {
-			return nil, status.Errorf(codes.Internal, "cannot convert leaf node to scalar type: %v", err)
-		}
-	}
-
-	// Update json tree of the device config.
-	var curNode interface{} = jsonTree
-	schema := s.model.schemaTreeRoot
-	for i, elem := range fullPath.Elem {
-		switch node := curNode.(type) {
-		case map[string]interface{}:
-			// Set node value.
-			if i == len(fullPath.Elem)-1 {
-				if elem.GetKey() == nil {
-					if grpcStatusError := setPathWithoutAttribute(op, node, elem, nodeVal); grpcStatusError != nil {
-						return nil, grpcStatusError
-					}
-					break
-				}
-				if grpcStatusError := setPathWithAttribute(op, node, elem, nodeVal); grpcStatusError != nil {
-					return nil, grpcStatusError
-				}
-				break
-			}
-
-			if curNode, schema = getChildNode(node, schema, elem, true); curNode == nil {
-				return nil, status.Errorf(codes.NotFound, "path elem not found: %v", elem)
-			}
-		case []interface{}:
-			return nil, status.Errorf(codes.NotFound, "incompatible path elem: %v", elem)
-		default:
-			return nil, status.Errorf(codes.Internal, "wrong node type: %T", curNode)
-		}
-	}
-	if reflect.DeepEqual(fullPath, pbRootPath) { // Replace/Update root.
-		if op == pb.UpdateResult_UPDATE {
-			return nil, status.Error(codes.Unimplemented, "update the root of config tree is unsupported")
-		}
-		nodeValAsTree, ok := nodeVal.(map[string]interface{})
-		if !ok {
-			return nil, status.Errorf(codes.InvalidArgument, "expect a tree to replace the root, got a scalar value: %T", nodeVal)
-		}
-		for k := range jsonTree {
-			delete(jsonTree, k)
-		}
-		for k, v := range nodeValAsTree {
-			jsonTree[k] = v
-		}
-	}
-	newConfig, err := s.toGoStruct(jsonTree)
-	if err != nil {
-		return nil, status.Error(codes.Internal, err.Error())
-	}
-
-	// Apply the validated operation to the device.
-	if s.callback != nil {
-		if applyErr := s.callback(newConfig); applyErr != nil {
-			if rollbackErr := s.callback(s.config); rollbackErr != nil {
-				return nil, status.Errorf(codes.Internal, "error in rollback the failed operation (%v): %v", applyErr, rollbackErr)
-			}
-			return nil, status.Errorf(codes.Aborted, "error in applying operation to device: %v", applyErr)
-		}
-	}
-	return &pb.UpdateResult{
-		Path: path,
-		Op:   op,
-	}, nil
-}
-
-func (s *Server) toGoStruct(jsonTree map[string]interface{}) (ygot.ValidatedGoStruct, error) {
-	jsonDump, err := json.Marshal(jsonTree)
-	if err != nil {
-		return nil, fmt.Errorf("error in marshaling IETF JSON tree to bytes: %v", err)
-	}
-	goStruct, err := s.model.NewConfigStruct(jsonDump)
-	if err != nil {
-		return nil, fmt.Errorf("error in creating config struct from IETF JSON data: %v", err)
-	}
-	return goStruct, nil
-}
-
-// getGNMIServiceVersion returns a pointer to the gNMI service version string.
-// The method is non-trivial because of the way it is defined in the proto file.
-func getGNMIServiceVersion() (*string, error) {
-	gzB := (&pb.Update{}).ProtoReflect().Descriptor()
-	r, err := gzip.NewReader(bytes.NewReader([]byte(gzB.Name())))
-	if err != nil {
-		return nil, fmt.Errorf("error in initializing gzip reader: %v", err)
-	}
-	defer r.Close()
-	b, err := ioutil.ReadAll(r)
-	if err != nil {
-		return nil, fmt.Errorf("error in reading gzip data: %v", err)
-	}
-	desc := &dpb.FileDescriptorProto{}
-	if err := proto.Unmarshal(b, desc); err != nil {
-		return nil, fmt.Errorf("error in unmarshaling proto: %v", err)
-	}
-	ver, err := proto.GetExtension(desc.Options, pb.E_GnmiService)
-	if err != nil {
-		return nil, fmt.Errorf("error in getting version from proto extension: %v", err)
-	}
-	return ver.(*string), nil
-}
-
-// deleteKeyedListEntry deletes the keyed list entry from node that matches the
-// path elem. If the entry is the only one in keyed list, deletes the entire
-// list. If the entry is found and deleted, the function returns true. If it is
-// not found, the function returns false.
-func deleteKeyedListEntry(node map[string]interface{}, elem *pb.PathElem) bool {
-	curNode, ok := node[elem.Name]
-	if !ok {
-		return false
-	}
-
-	keyedList, ok := curNode.([]interface{})
-	if !ok {
-		return false
-	}
-	for i, n := range keyedList {
-		m, ok := n.(map[string]interface{})
-		if !ok {
-			log.Errorf("expect map[string]interface{} for a keyed list entry, got %T", n)
-			return false
-		}
-		keyMatching := true
-		for k, v := range elem.Key {
-			attrVal, ok := m[k]
-			if !ok {
-				return false
-			}
-			if v != fmt.Sprintf("%v", attrVal) {
-				keyMatching = false
-				break
-			}
-		}
-		if keyMatching {
-			listLen := len(keyedList)
-			if listLen == 1 {
-				delete(node, elem.Name)
-				return true
-			}
-			keyedList[i] = keyedList[listLen-1]
-			node[elem.Name] = keyedList[0 : listLen-1]
-			return true
-		}
-	}
-	return false
-}
-
-// gnmiFullPath builds the full path from the prefix and path.
-func gnmiFullPath(prefix, path *pb.Path) *pb.Path {
-	fullPath := &pb.Path{Origin: path.Origin}
-	if path.GetElem() != nil {
-		fullPath.Elem = append(prefix.GetElem(), path.GetElem()...)
-	}
-	return fullPath
-}
-
-// isNIl checks if an interface is nil or its value is nil.
-func isNil(i interface{}) bool {
-	if i == nil {
-		return true
-	}
-	switch kind := reflect.ValueOf(i).Kind(); kind {
-	case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice:
-		return reflect.ValueOf(i).IsNil()
-	default:
-		return false
-	}
-}
-
-// setPathWithAttribute replaces or updates a child node of curNode in the IETF
-// JSON config tree, where the child node is indexed by pathElem with attribute.
-// The function returns grpc status error if unsuccessful.
-func setPathWithAttribute(op pb.UpdateResult_Operation, curNode map[string]interface{}, pathElem *pb.PathElem, nodeVal interface{}) error {
-	nodeValAsTree, ok := nodeVal.(map[string]interface{})
-	if !ok {
-		return status.Errorf(codes.InvalidArgument, "expect nodeVal is a json node of map[string]interface{}, received %T", nodeVal)
-	}
-	m := getKeyedListEntry(curNode, pathElem, true)
-	if m == nil {
-		return status.Errorf(codes.NotFound, "path elem not found: %v", pathElem)
-	}
-	if op == pb.UpdateResult_REPLACE {
-		for k := range m {
-			delete(m, k)
-		}
-	}
-	for attrKey, attrVal := range pathElem.GetKey() {
-		m[attrKey] = attrVal
-		if asNum, err := strconv.ParseFloat(attrVal, 64); err == nil {
-			m[attrKey] = asNum
-		}
-		for k, v := range nodeValAsTree {
-			if k == attrKey && fmt.Sprintf("%v", v) != attrVal {
-				return status.Errorf(codes.InvalidArgument, "invalid config data: %v is a path attribute", k)
-			}
-		}
-	}
-	for k, v := range nodeValAsTree {
-		m[k] = v
-	}
-	return nil
-}
-
-// setPathWithoutAttribute replaces or updates a child node of curNode in the
-// IETF config tree, where the child node is indexed by pathElem without
-// attribute. The function returns grpc status error if unsuccessful.
-func setPathWithoutAttribute(op pb.UpdateResult_Operation, curNode map[string]interface{}, pathElem *pb.PathElem, nodeVal interface{}) error {
-	target, hasElem := curNode[pathElem.Name]
-	nodeValAsTree, nodeValIsTree := nodeVal.(map[string]interface{})
-	if op == pb.UpdateResult_REPLACE || !hasElem || !nodeValIsTree {
-		curNode[pathElem.Name] = nodeVal
-		return nil
-	}
-	targetAsTree, ok := target.(map[string]interface{})
-	if !ok {
-		return status.Errorf(codes.Internal, "error in setting path: expect map[string]interface{} to update, got %T", target)
-	}
-	for k, v := range nodeValAsTree {
-		targetAsTree[k] = v
-	}
-	return nil
-}
-
-// Capabilities returns supported encodings and supported models.
-func (s *Server) Capabilities(ctx context.Context, req *pb.CapabilityRequest) (*pb.CapabilityResponse, error) {
-	ver, err := getGNMIServiceVersion()
-	if err != nil {
-		return nil, status.Errorf(codes.Internal, "error in getting gnmi service version: %v", err)
-	}
-	return &pb.CapabilityResponse{
-		SupportedModels:    s.model.modelData,
-		SupportedEncodings: supportedEncodings,
-		GNMIVersion:        *ver,
-	}, nil
-}
-
-// Get implements the Get RPC in gNMI spec.
-func (s *Server) Get(ctx context.Context, req *pb.GetRequest) (*pb.GetResponse, error) {
-	if req.GetType() != pb.GetRequest_ALL {
-		return nil, status.Errorf(codes.Unimplemented, "unsupported request type: %s", pb.GetRequest_DataType_name[int32(req.GetType())])
-	}
-	if err := s.checkEncodingAndModel(req.GetEncoding(), req.GetUseModels()); err != nil {
-		return nil, status.Error(codes.Unimplemented, err.Error())
-	}
-
-	prefix := req.GetPrefix()
-	paths := req.GetPath()
-	notifications := make([]*pb.Notification, 0)
-
-	s.mu.RLock()
-	defer s.mu.RUnlock()
-
-	for _, path := range paths {
-		// Get schema node for path from config struct.
-		fullPath := path
-		if prefix != nil {
-			fullPath = gnmiFullPath(prefix, path)
-		}
-		if fullPath.GetElem() == nil && fullPath.GetElement() != nil {
-			return nil, status.Error(codes.Unimplemented, "deprecated path element type is unsupported")
-		}
-		opts := []ytypes.GetNodeOpt{&ytypes.GetHandleWildcards{}, &ytypes.GetPartialKeyMatch{}}
-		nodes, err := ytypes.GetNode(s.model.schemaTreeRoot, s.config, fullPath, opts...)
-		if len(nodes) == 0 || err != nil || util.IsValueNil(nodes[0].Data) {
-			return nil, status.Errorf(codes.NotFound, "path %v not found: %v", fullPath, err)
-		}
-		for _, n := range nodes {
-			node := n.Data
-			ts := time.Now().UnixNano()
-
-			nodeStruct, ok := node.(ygot.GoStruct)
-			// Return leaf node.
-			if !ok {
-				var val *pb.TypedValue
-				switch kind := reflect.ValueOf(node).Kind(); kind {
-				case reflect.Ptr, reflect.Interface:
-					var err error
-					val, err = value.FromScalar(reflect.ValueOf(node).Elem().Interface())
-					if err != nil {
-						msg := fmt.Sprintf("leaf node %v does not contain a scalar type value: %v", path, err)
-						log.Error(msg)
-						return nil, status.Error(codes.Internal, msg)
-					}
-				case reflect.Int64:
-					enumMap, ok := s.model.enumData[reflect.TypeOf(node).Name()]
-					if !ok {
-						return nil, status.Error(codes.Internal, "not a GoStruct enumeration type")
-					}
-					val = &pb.TypedValue{
-						Value: &pb.TypedValue_StringVal{
-							StringVal: enumMap[reflect.ValueOf(node).Int()].Name,
-						},
-					}
-				default:
-					return nil, status.Errorf(codes.Internal, "unexpected kind of leaf node type: %v %v", node, kind)
-				}
-
-				update := &pb.Update{Path: path, Val: val}
-				notification := &pb.Notification{
-					Timestamp: ts,
-					Prefix:    prefix,
-					Update:    []*pb.Update{update},
-				}
-				notifications = append(notifications, notification)
-				continue
-			}
-
-			if req.GetUseModels() != nil {
-				return nil, status.Errorf(codes.Unimplemented, "filtering Get using use_models is unsupported, got: %v", req.GetUseModels())
-			}
-
-			nots, err := ygot.TogNMINotifications(nodeStruct, ts, ygot.GNMINotificationsConfig{
-				UsePathElem:       false,
-				StringSlicePrefix: []string{"interfaces", "interface"},
-			})
-
-			if err != nil {
-				return nil, err
-			}
-
-			notifications = append(notifications, nots...)
-
-		}
-	}
-
-	return &pb.GetResponse{Notification: notifications}, nil
-}
-
-// Set implements the Set RPC in gNMI spec.
-func (s *Server) Set(ctx context.Context, req *pb.SetRequest) (*pb.SetResponse, error) {
-	s.mu.Lock()
-	defer s.mu.Unlock()
-
-	jsonTree, err := ygot.ConstructIETFJSON(s.config, &ygot.RFC7951JSONConfig{})
-	if err != nil {
-		msg := fmt.Sprintf("error in constructing IETF JSON tree from config struct: %v", err)
-		log.Error(msg)
-		return nil, status.Error(codes.Internal, msg)
-	}
-
-	prefix := req.GetPrefix()
-	var results []*pb.UpdateResult
-
-	for _, path := range req.GetDelete() {
-		res, grpcStatusError := s.doDelete(jsonTree, prefix, path)
-		if grpcStatusError != nil {
-			return nil, grpcStatusError
-		}
-		results = append(results, res)
-	}
-	for _, upd := range req.GetReplace() {
-		res, grpcStatusError := s.doReplaceOrUpdate(jsonTree, pb.UpdateResult_REPLACE, prefix, upd.GetPath(), upd.GetVal())
-		if grpcStatusError != nil {
-			return nil, grpcStatusError
-		}
-		results = append(results, res)
-	}
-	for _, upd := range req.GetUpdate() {
-		res, grpcStatusError := s.doReplaceOrUpdate(jsonTree, pb.UpdateResult_UPDATE, prefix, upd.GetPath(), upd.GetVal())
-		if grpcStatusError != nil {
-			return nil, grpcStatusError
-		}
-		results = append(results, res)
-	}
-
-	jsonDump, err := json.Marshal(jsonTree)
-	if err != nil {
-		msg := fmt.Sprintf("error in marshaling IETF JSON tree to bytes: %v", err)
-		log.Error(msg)
-		return nil, status.Error(codes.Internal, msg)
-	}
-	rootStruct, err := s.model.NewConfigStruct(jsonDump)
-	if err != nil {
-		msg := fmt.Sprintf("error in creating config struct from IETF JSON data: %v", err)
-		log.Error(msg)
-		return nil, status.Error(codes.Internal, msg)
-	}
-	s.config = rootStruct
-	return &pb.SetResponse{
-		Prefix:   req.GetPrefix(),
-		Response: results,
-	}, nil
-}
-
-// Subscribe method is not implemented.
-func (s *Server) Subscribe(stream pb.GNMI_SubscribeServer) error {
-	return status.Error(codes.Unimplemented, "Subscribe is not implemented.")
-}
-
-// InternalUpdate is an experimental feature to let the server update its
-// internal states. Use it with your own risk.
-func (s *Server) InternalUpdate(fp func(config ygot.ValidatedGoStruct) error) error {
-	s.mu.Lock()
-	defer s.mu.Unlock()
-	return fp(s.config)
-}
diff --git a/forks/google/gnmi/server_test.go b/forks/google/gnmi/server_test.go
deleted file mode 100644
index 68ffea696..000000000
--- a/forks/google/gnmi/server_test.go
+++ /dev/null
@@ -1,1161 +0,0 @@
-/* Copyright 2017 Google Inc.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    https://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 gnmi
-
-import (
-	"encoding/json"
-	"reflect"
-	"testing"
-
-	"github.com/golang/protobuf/proto"
-	"github.com/openconfig/gnmi/value"
-	"github.com/openconfig/ygot/ygot"
-	"google.golang.org/grpc/codes"
-	"google.golang.org/grpc/status"
-
-	pb "github.com/openconfig/gnmi/proto/gnmi"
-
-	"github.com/google/gnxi/gnmi/modeldata"
-	"github.com/google/gnxi/gnmi/modeldata/gostruct"
-)
-
-var (
-	// model is the model for test config server.
-	model = &Model{
-		modelData:       modeldata.ModelData,
-		structRootType:  reflect.TypeOf((*gostruct.Device)(nil)),
-		schemaTreeRoot:  gostruct.SchemaTree["Device"],
-		jsonUnmarshaler: gostruct.Unmarshal,
-		enumData:        gostruct.ΛEnum,
-	}
-)
-
-func TestCapabilities(t *testing.T) {
-	s, err := NewServer(model, nil, nil)
-	if err != nil {
-		t.Fatalf("error in creating server: %v", err)
-	}
-	resp, err := s.Capabilities(nil, &pb.CapabilityRequest{})
-	if err != nil {
-		t.Fatalf("got error %v, want nil", err)
-	}
-	if !reflect.DeepEqual(resp.GetSupportedModels(), model.modelData) {
-		t.Errorf("got supported models %v\nare not the same as\nmodel supported by the server %v", resp.GetSupportedModels(), model.modelData)
-	}
-	if !reflect.DeepEqual(resp.GetSupportedEncodings(), supportedEncodings) {
-		t.Errorf("got supported encodings %v\nare not the same as\nencodings supported by the server %v", resp.GetSupportedEncodings(), supportedEncodings)
-	}
-}
-
-func TestGet(t *testing.T) {
-	jsonConfigRoot := `{
-		"openconfig-system:system": {
-			"openconfig-openflow:openflow": {
-				"agent": {
-					"config": {
-						"failure-mode": "SECURE",
-						"max-backoff": 10
-					}
-				}
-			}
-		},
-	  "openconfig-platform:components": {
-	    "component": [
-	      {
-	        "config": {
-	          "name": "swpri1-1-1"
-	        },
-	        "name": "swpri1-1-1"
-	      }
-	    ]
-	  }
-	}`
-
-	s, err := NewServer(model, []byte(jsonConfigRoot), nil)
-	if err != nil {
-		t.Fatalf("error in creating server: %v", err)
-	}
-
-	tds := []struct {
-		desc        string
-		textPbPath  string
-		modelData   []*pb.ModelData
-		wantRetCode codes.Code
-		wantRespVal interface{}
-	}{{
-		desc: "get valid but non-existing node",
-		textPbPath: `
-			elem: <name: "system" >
-			elem: <name: "clock" >
-		`,
-		wantRetCode: codes.NotFound,
-	}, {
-		desc:        "root node",
-		wantRetCode: codes.OK,
-		wantRespVal: jsonConfigRoot,
-	}, {
-		desc: "get non-enum type",
-		textPbPath: `
-					elem: <name: "system" >
-					elem: <name: "openflow" >
-					elem: <name: "agent" >
-					elem: <name: "config" >
-					elem: <name: "max-backoff" >
-				`,
-		wantRetCode: codes.OK,
-		wantRespVal: uint64(10),
-	}, {
-		desc: "get enum type",
-		textPbPath: `
-					elem: <name: "system" >
-					elem: <name: "openflow" >
-					elem: <name: "agent" >
-					elem: <name: "config" >
-					elem: <name: "failure-mode" >
-				`,
-		wantRetCode: codes.OK,
-		wantRespVal: "SECURE",
-	}, {
-		desc:        "root child node",
-		textPbPath:  `elem: <name: "components" >`,
-		wantRetCode: codes.OK,
-		wantRespVal: `{
-							"openconfig-platform:component": [{
-								"config": {
-						        	"name": "swpri1-1-1"
-								},
-						        "name": "swpri1-1-1"
-							}]}`,
-	}, {
-		desc: "node with attribute",
-		textPbPath: `
-								elem: <name: "components" >
-								elem: <
-									name: "component"
-									key: <key: "name" value: "swpri1-1-1" >
-								>`,
-		wantRetCode: codes.OK,
-		wantRespVal: `{
-								"openconfig-platform:config": {"name": "swpri1-1-1"},
-								"openconfig-platform:name": "swpri1-1-1"
-							}`,
-	}, {
-		desc: "node with attribute in its parent",
-		textPbPath: `
-								elem: <name: "components" >
-								elem: <
-									name: "component"
-									key: <key: "name" value: "swpri1-1-1" >
-								>
-								elem: <name: "config" >`,
-		wantRetCode: codes.OK,
-		wantRespVal: `{"openconfig-platform:name": "swpri1-1-1"}`,
-	}, {
-		desc: "ref leaf node",
-		textPbPath: `
-								elem: <name: "components" >
-								elem: <
-									name: "component"
-									key: <key: "name" value: "swpri1-1-1" >
-								>
-								elem: <name: "name" >`,
-		wantRetCode: codes.OK,
-		wantRespVal: "swpri1-1-1",
-	}, {
-		desc: "regular leaf node",
-		textPbPath: `
-								elem: <name: "components" >
-								elem: <
-									name: "component"
-									key: <key: "name" value: "swpri1-1-1" >
-								>
-								elem: <name: "config" >
-								elem: <name: "name" >`,
-		wantRetCode: codes.OK,
-		wantRespVal: "swpri1-1-1",
-	}, {
-		desc: "non-existing node: wrong path name",
-		textPbPath: `
-								elem: <name: "components" >
-								elem: <
-									name: "component"
-									key: <key: "foo" value: "swpri1-1-1" >
-								>
-								elem: <name: "bar" >`,
-		wantRetCode: codes.NotFound,
-	}, {
-		desc: "non-existing node: wrong path attribute",
-		textPbPath: `
-								elem: <name: "components" >
-								elem: <
-									name: "component"
-									key: <key: "foo" value: "swpri2-2-2" >
-								>
-								elem: <name: "name" >`,
-		wantRetCode: codes.NotFound,
-	}, {
-		desc:        "use of model data not supported",
-		modelData:   []*pb.ModelData{{}},
-		wantRetCode: codes.Unimplemented,
-	}}
-
-	for _, td := range tds {
-		t.Run(td.desc, func(t *testing.T) {
-			runTestGet(t, s, td.textPbPath, td.wantRetCode, td.wantRespVal, td.modelData)
-		})
-	}
-}
-
-// runTestGet requests a path from the server by Get grpc call, and compares if
-// the return code and response value are expected.
-func runTestGet(t *testing.T, s *Server, textPbPath string, wantRetCode codes.Code, wantRespVal interface{}, useModels []*pb.ModelData) {
-	// Send request
-	var pbPath pb.Path
-	if err := proto.UnmarshalText(textPbPath, &pbPath); err != nil {
-		t.Fatalf("error in unmarshaling path: %v", err)
-	}
-	req := &pb.GetRequest{
-		Path:      []*pb.Path{&pbPath},
-		Encoding:  pb.Encoding_JSON_IETF,
-		UseModels: useModels,
-	}
-	resp, err := s.Get(nil, req)
-
-	// Check return code
-	gotRetStatus, ok := status.FromError(err)
-	if !ok {
-		t.Fatal("got a non-grpc error from grpc call")
-	}
-	if gotRetStatus.Code() != wantRetCode {
-		t.Fatalf("got return code %v, want %v", gotRetStatus.Code(), wantRetCode)
-	}
-
-	// Check response value
-	var gotVal interface{}
-	if resp != nil {
-		notifs := resp.GetNotification()
-		if len(notifs) != 1 {
-			t.Fatalf("got %d notifications, want 1", len(notifs))
-		}
-		updates := notifs[0].GetUpdate()
-		if len(updates) != 1 {
-			t.Fatalf("got %d updates in the notification, want 1", len(updates))
-		}
-		val := updates[0].GetVal()
-		if val.GetJsonIetfVal() == nil {
-			gotVal, err = value.ToScalar(val)
-			if err != nil {
-				t.Errorf("got: %v, want a scalar value", gotVal)
-			}
-		} else {
-			// Unmarshal json data to gotVal container for comparison
-			if err := json.Unmarshal(val.GetJsonIetfVal(), &gotVal); err != nil {
-				t.Fatalf("error in unmarshaling IETF JSON data to json container: %v", err)
-			}
-			var wantJSONStruct interface{}
-			if err := json.Unmarshal([]byte(wantRespVal.(string)), &wantJSONStruct); err != nil {
-				t.Fatalf("error in unmarshaling IETF JSON data to json container: %v", err)
-			}
-			wantRespVal = wantJSONStruct
-		}
-	}
-
-	if !reflect.DeepEqual(gotVal, wantRespVal) {
-		t.Errorf("got: %v (%T),\nwant %v (%T)", gotVal, gotVal, wantRespVal, wantRespVal)
-	}
-}
-
-type gnmiSetTestCase struct {
-	desc        string                    // description of test case.
-	initConfig  string                    // config before the operation.
-	op          pb.UpdateResult_Operation // operation type.
-	textPbPath  string                    // text format of gnmi Path proto.
-	val         *pb.TypedValue            // value for UPDATE/REPLACE operations. always nil for DELETE.
-	wantRetCode codes.Code                // grpc return code.
-	wantConfig  string                    // config after the operation.
-}
-
-func TestDelete(t *testing.T) {
-	tests := []gnmiSetTestCase{{
-		desc: "delete leaf node",
-		initConfig: `{
-			"system": {
-				"config": {
-					"hostname": "switch_a",
-					"login-banner": "Hello!"
-				}
-			}
-		}`,
-		op: pb.UpdateResult_DELETE,
-		textPbPath: `
-			elem: <name: "system" >
-			elem: <name: "config" >
-			elem: <name: "login-banner" >
-		`,
-		wantRetCode: codes.OK,
-		wantConfig: `{
-			"system": {
-				"config": {
-					"hostname": "switch_a"
-				}
-			}
-		}`,
-	}, {
-		desc: "delete sub-tree",
-		initConfig: `{
-			"system": {
-				"clock": {
-					"config": {
-						"timezone-name": "Europe/Stockholm"
-					}
-				},
-				"config": {
-					"hostname": "switch_a"
-				}
-			}
-		}`,
-		op: pb.UpdateResult_DELETE,
-		textPbPath: `
-			elem: <name: "system" >
-			elem: <name: "clock" >
-		`,
-		wantRetCode: codes.OK,
-		wantConfig: `{
-			"system": {
-				"config": {
-					"hostname": "switch_a"
-				}
-			}
-		}`,
-	}, {
-		desc: "delete a sub-tree with only one leaf node",
-		initConfig: `{
-			"system": {
-				"clock": {
-					"config": {
-						"timezone-name": "Europe/Stockholm"
-					}
-				},
-				"config": {
-					"hostname": "switch_a"
-				}
-			}
-		}`,
-		op: pb.UpdateResult_DELETE,
-		textPbPath: `
-			elem: <name: "system" >
-			elem: <name: "clock" >
-			elem: <name: "config" >
-		`,
-		wantRetCode: codes.OK,
-		wantConfig: `{
-			"system": {
-				"config": {
-					"hostname": "switch_a"
-				}
-			}
-		}`,
-	}, {
-		desc: "delete a leaf node whose parent has only this child",
-		initConfig: `{
-			"system": {
-				"clock": {
-					"config": {
-						"timezone-name": "Europe/Stockholm"
-					}
-				},
-				"config": {
-					"hostname": "switch_a"
-				}
-			}
-		}`,
-		op: pb.UpdateResult_DELETE,
-		textPbPath: `
-			elem: <name: "system" >
-			elem: <name: "clock" >
-			elem: <name: "config" >
-			elem: <name: "timezone-name" >
-		`,
-		wantRetCode: codes.OK,
-		wantConfig: `{
-			"system": {
-				"config": {
-					"hostname": "switch_a"
-				}
-			}
-		}`,
-	}, {
-		desc: "delete root",
-		initConfig: `{
-			"system": {
-				"config": {
-					"hostname": "switch_a"
-				}
-			}
-		}`,
-		op:          pb.UpdateResult_DELETE,
-		wantRetCode: codes.OK,
-		wantConfig:  `{}`,
-	}, {
-		desc: "delete non-existing node",
-		initConfig: `{
-			"system": {
-				"clock": {
-					"config": {
-						"timezone-name": "Europe/Stockholm"
-					}
-				}
-			}
-		}`,
-		op: pb.UpdateResult_DELETE,
-		textPbPath: `
-			elem: <name: "system" >
-			elem: <name: "clock" >
-			elem: <name: "config" >
-			elem: <name: "foo-bar" >
-		`,
-		wantRetCode: codes.OK,
-		wantConfig: `{
-			"system": {
-				"clock": {
-					"config": {
-						"timezone-name": "Europe/Stockholm"
-					}
-				}
-			}
-		}`,
-	}, {
-		desc: "delete node with non-existing precedent path",
-		initConfig: `{
-			"system": {
-				"clock": {
-					"config": {
-						"timezone-name": "Europe/Stockholm"
-					}
-				}
-			}
-		}`,
-		op: pb.UpdateResult_DELETE,
-		textPbPath: `
-			elem: <name: "system" >
-			elem: <name: "clock" >
-			elem: <name: "foo-bar" >
-			elem: <name: "timezone-name" >
-		`,
-		wantRetCode: codes.OK,
-		wantConfig: `{
-			"system": {
-				"clock": {
-					"config": {
-						"timezone-name": "Europe/Stockholm"
-					}
-				}
-			}
-		}`,
-	}, {
-		desc: "delete node with non-existing attribute in precedent path",
-		initConfig: `{
-			"system": {
-				"clock": {
-					"config": {
-						"timezone-name": "Europe/Stockholm"
-					}
-				}
-			}
-		}`,
-		op: pb.UpdateResult_DELETE,
-		textPbPath: `
-			elem: <name: "system" >
-			elem: <name: "clock" >
-			elem: <
-				name: "config"
-				key: <key: "name" value: "foo" >
-			>
-			elem: <name: "timezone-name" >`,
-		wantRetCode: codes.OK,
-		wantConfig: `{
-			"system": {
-				"clock": {
-					"config": {
-						"timezone-name": "Europe/Stockholm"
-					}
-				}
-			}
-		}`,
-	}, {
-		desc: "delete node with non-existing attribute",
-		initConfig: `{
-			"system": {
-				"clock": {
-					"config": {
-						"timezone-name": "Europe/Stockholm"
-					}
-				}
-			}
-		}`,
-		op: pb.UpdateResult_DELETE,
-		textPbPath: `
-			elem: <name: "system" >
-			elem: <name: "clock" >
-			elem: <name: "config" >
-			elem: <
-				name: "timezone-name"
-				key: <key: "name" value: "foo" >
-			>
-			elem: <name: "timezone-name" >`,
-		wantRetCode: codes.OK,
-		wantConfig: `{
-			"system": {
-				"clock": {
-					"config": {
-						"timezone-name": "Europe/Stockholm"
-					}
-				}
-			}
-		}`,
-	}, {
-		desc: "delete leaf node with attribute in its precedent path",
-		initConfig: `{
-			"components": {
-				"component": [
-					{
-						"name": "swpri1-1-1",
-						"config": {
-							"name": "swpri1-1-1"
-						},
-						"state": {
-							"name": "swpri1-1-1",
-							"mfg-name": "foo bar inc."
-						}
-					}
-				]
-			}
-		}`,
-		op: pb.UpdateResult_DELETE,
-		textPbPath: `
-			elem: <name: "components" >
-			elem: <
-				name: "component"
-				key: <key: "name" value: "swpri1-1-1" >
-			>
-			elem: <name: "state" >
-			elem: <name: "mfg-name" >`,
-		wantRetCode: codes.OK,
-		wantConfig: `{
-			"components": {
-				"component": [
-					{
-						"name": "swpri1-1-1",
-						"config": {
-							"name": "swpri1-1-1"
-						},
-						"state": {
-							"name": "swpri1-1-1"
-						}
-					}
-				]
-			}
-		}`,
-	}, {
-		desc: "delete sub-tree with attribute in its precedent path",
-		initConfig: `{
-			"components": {
-				"component": [
-					{
-						"name": "swpri1-1-1",
-						"config": {
-							"name": "swpri1-1-1"
-						},
-						"state": {
-							"name": "swpri1-1-1",
-							"mfg-name": "foo bar inc."
-						}
-					}
-				]
-			}
-		}`,
-		op: pb.UpdateResult_DELETE,
-		textPbPath: `
-			elem: <name: "components" >
-			elem: <
-				name: "component"
-				key: <key: "name" value: "swpri1-1-1" >
-			>
-			elem: <name: "state" >`,
-		wantRetCode: codes.OK,
-		wantConfig: `{
-			"components": {
-				"component": [
-					{
-						"name": "swpri1-1-1",
-						"config": {
-							"name": "swpri1-1-1"
-						}
-					}
-				]
-			}
-		}`,
-	}, {
-		desc: "delete path node with attribute",
-		initConfig: `{
-			"components": {
-				"component": [
-					{
-						"name": "swpri1-1-1",
-						"config": {
-							"name": "swpri1-1-1"
-						}
-					},
-					{
-						"name": "swpri1-1-2",
-						"config": {
-							"name": "swpri1-1-2"
-						}
-					}
-				]
-			}
-		}`,
-		op: pb.UpdateResult_DELETE,
-		textPbPath: `
-			elem: <name: "components" >
-			elem: <
-				name: "component"
-				key: <key: "name" value: "swpri1-1-1" >
-			>`,
-		wantRetCode: codes.OK,
-		wantConfig: `{
-			"components": {
-				"component": [
-					{
-						"name": "swpri1-1-2",
-						"config": {
-							"name": "swpri1-1-2"
-						}
-					}
-				]
-			}
-		}`,
-	}, {
-		desc: "delete path node with int type attribute",
-		initConfig: `{
-			"system": {
-				"openflow": {
-					"controllers": {
-						"controller": [
-							{
-								"config": {
-									"name": "main"
-								},
-								"connections": {
-									"connection": [
-										{
-											"aux-id": 0,
-											"config": {
-												"address": "192.0.2.10",
-												"aux-id": 0
-											}
-										}
-									]
-								},
-								"name": "main"
-							}
-						]
-					}
-				}
-			}
-		}`,
-		op: pb.UpdateResult_DELETE,
-		textPbPath: `
-			elem: <name: "system" >
-			elem: <name: "openflow" >
-			elem: <name: "controllers" >
-			elem: <
-				name: "controller"
-				key: <key: "name" value: "main" >
-			>
-			elem: <name: "connections" >
-			elem: <
-				name: "connection"
-				key: <key: "aux-id" value: "0" >
-			>
-			`,
-		wantRetCode: codes.OK,
-		wantConfig: `{
-			"system": {
-				"openflow": {
-					"controllers": {
-						"controller": [
-							{
-								"config": {
-									"name": "main"
-								},
-								"name": "main"
-							}
-						]
-					}
-				}
-			}
-		}`,
-	}, {
-		desc: "delete leaf node with non-existing attribute value",
-		initConfig: `{
-			"components": {
-				"component": [
-					{
-						"name": "swpri1-1-1",
-						"config": {
-							"name": "swpri1-1-1"
-						}
-					}
-				]
-			}
-		}`,
-		op: pb.UpdateResult_DELETE,
-		textPbPath: `
-			elem: <name: "components" >
-			elem: <
-				name: "component"
-				key: <key: "name" value: "foo" >
-			>`,
-		wantRetCode: codes.OK,
-		wantConfig: `{
-			"components": {
-				"component": [
-					{
-						"name": "swpri1-1-1",
-						"config": {
-							"name": "swpri1-1-1"
-						}
-					}
-				]
-			}
-		}`,
-	}, {
-		desc: "delete leaf node with non-existing attribute value in precedent path",
-		initConfig: `{
-			"components": {
-				"component": [
-					{
-						"name": "swpri1-1-1",
-						"config": {
-							"name": "swpri1-1-1"
-						},
-						"state": {
-							"name": "swpri1-1-1",
-							"mfg-name": "foo bar inc."
-						}
-					}
-				]
-			}
-		}`,
-		op: pb.UpdateResult_DELETE,
-		textPbPath: `
-			elem: <name: "components" >
-			elem: <
-				name: "component"
-				key: <key: "name" value: "foo" >
-			>
-			elem: <name: "state" >
-			elem: <name: "mfg-name" >
-		`,
-		wantRetCode: codes.OK,
-		wantConfig: `{
-			"components": {
-				"component": [
-					{
-						"name": "swpri1-1-1",
-						"config": {
-							"name": "swpri1-1-1"
-						},
-						"state": {
-							"name": "swpri1-1-1",
-							"mfg-name": "foo bar inc."
-						}
-					}
-				]
-			}
-		}`,
-	}}
-
-	for _, tc := range tests {
-		t.Run(tc.desc, func(t *testing.T) {
-			runTestSet(t, model, tc)
-		})
-	}
-}
-
-func TestReplace(t *testing.T) {
-	systemConfig := `{
-		"system": {
-			"clock": {
-				"config": {
-					"timezone-name": "Europe/Stockholm"
-				}
-			},
-			"config": {
-				"hostname": "switch_a",
-				"login-banner": "Hello!"
-			}
-		}
-	}`
-
-	tests := []gnmiSetTestCase{{
-		desc:       "replace root",
-		initConfig: `{}`,
-		op:         pb.UpdateResult_REPLACE,
-		val: &pb.TypedValue{
-			Value: &pb.TypedValue_JsonIetfVal{
-				JsonIetfVal: []byte(systemConfig),
-			}},
-		wantRetCode: codes.OK,
-		wantConfig:  systemConfig,
-	}, {
-		desc:       "replace a subtree",
-		initConfig: `{}`,
-		op:         pb.UpdateResult_REPLACE,
-		textPbPath: `
-			elem: <name: "system" >
-			elem: <name: "clock" >
-		`,
-		val: &pb.TypedValue{
-			Value: &pb.TypedValue_JsonIetfVal{
-				JsonIetfVal: []byte(`{"config": {"timezone-name": "US/New York"}}`),
-			},
-		},
-		wantRetCode: codes.OK,
-		wantConfig: `{
-			"system": {
-				"clock": {
-					"config": {
-						"timezone-name": "US/New York"
-					}
-				}
-			}
-		}`,
-	}, {
-		desc:       "replace a keyed list subtree",
-		initConfig: `{}`,
-		op:         pb.UpdateResult_REPLACE,
-		textPbPath: `
-			elem: <name: "components" >
-			elem: <
-				name: "component"
-				key: <key: "name" value: "swpri1-1-1" >
-			>`,
-		val: &pb.TypedValue{
-			Value: &pb.TypedValue_JsonIetfVal{
-				JsonIetfVal: []byte(`{"config": {"name": "swpri1-1-1"}}`),
-			},
-		},
-		wantRetCode: codes.OK,
-		wantConfig: `{
-			"components": {
-				"component": [
-					{
-						"name": "swpri1-1-1",
-						"config": {
-							"name": "swpri1-1-1"
-						}
-					}
-				]
-			}
-		}`,
-	}, {
-		desc: "replace node with int type attribute in its precedent path",
-		initConfig: `{
-			"system": {
-				"openflow": {
-					"controllers": {
-						"controller": [
-							{
-								"config": {
-									"name": "main"
-								},
-								"name": "main"
-							}
-						]
-					}
-				}
-			}
-		}`,
-		op: pb.UpdateResult_REPLACE,
-		textPbPath: `
-			elem: <name: "system" >
-			elem: <name: "openflow" >
-			elem: <name: "controllers" >
-			elem: <
-				name: "controller"
-				key: <key: "name" value: "main" >
-			>
-			elem: <name: "connections" >
-			elem: <
-				name: "connection"
-				key: <key: "aux-id" value: "0" >
-			>
-			elem: <name: "config" >
-		`,
-		val: &pb.TypedValue{
-			Value: &pb.TypedValue_JsonIetfVal{
-				JsonIetfVal: []byte(`{"address": "192.0.2.10", "aux-id": 0}`),
-			},
-		},
-		wantRetCode: codes.OK,
-		wantConfig: `{
-			"system": {
-				"openflow": {
-					"controllers": {
-						"controller": [
-							{
-								"config": {
-									"name": "main"
-								},
-								"connections": {
-									"connection": [
-										{
-											"aux-id": 0,
-											"config": {
-												"address": "192.0.2.10",
-												"aux-id": 0
-											}
-										}
-									]
-								},
-								"name": "main"
-							}
-						]
-					}
-				}
-			}
-		}`,
-	}, {
-		desc:       "replace a leaf node of int type",
-		initConfig: `{}`,
-		op:         pb.UpdateResult_REPLACE,
-		textPbPath: `
-			elem: <name: "system" >
-			elem: <name: "openflow" >
-			elem: <name: "agent" >
-			elem: <name: "config" >
-			elem: <name: "backoff-interval" >
-		`,
-		val: &pb.TypedValue{
-			Value: &pb.TypedValue_IntVal{IntVal: 5},
-		},
-		wantRetCode: codes.OK,
-		wantConfig: `{
-			"system": {
-				"openflow": {
-					"agent": {
-						"config": {
-							"backoff-interval": 5
-						}
-					}
-				}
-			}
-		}`,
-	}, {
-		desc:       "replace a leaf node of string type",
-		initConfig: `{}`,
-		op:         pb.UpdateResult_REPLACE,
-		textPbPath: `
-			elem: <name: "system" >
-			elem: <name: "openflow" >
-			elem: <name: "agent" >
-			elem: <name: "config" >
-			elem: <name: "datapath-id" >
-		`,
-		val: &pb.TypedValue{
-			Value: &pb.TypedValue_StringVal{StringVal: "00:16:3e:00:00:00:00:00"},
-		},
-		wantRetCode: codes.OK,
-		wantConfig: `{
-			"system": {
-				"openflow": {
-					"agent": {
-						"config": {
-							"datapath-id": "00:16:3e:00:00:00:00:00"
-						}
-					}
-				}
-			}
-		}`,
-	}, {
-		desc:       "replace a leaf node of enum type",
-		initConfig: `{}`,
-		op:         pb.UpdateResult_REPLACE,
-		textPbPath: `
-			elem: <name: "system" >
-			elem: <name: "openflow" >
-			elem: <name: "agent" >
-			elem: <name: "config" >
-			elem: <name: "failure-mode" >
-		`,
-		val: &pb.TypedValue{
-			Value: &pb.TypedValue_StringVal{StringVal: "SECURE"},
-		},
-		wantRetCode: codes.OK,
-		wantConfig: `{
-			"system": {
-				"openflow": {
-					"agent": {
-						"config": {
-							"failure-mode": "SECURE"
-						}
-					}
-				}
-			}
-		}`,
-	}, {
-		desc:       "replace an non-existing leaf node",
-		initConfig: `{}`,
-		op:         pb.UpdateResult_REPLACE,
-		textPbPath: `
-			elem: <name: "system" >
-			elem: <name: "openflow" >
-			elem: <name: "agent" >
-			elem: <name: "config" >
-			elem: <name: "foo-bar" >
-		`,
-		val: &pb.TypedValue{
-			Value: &pb.TypedValue_StringVal{StringVal: "SECURE"},
-		},
-		wantRetCode: codes.NotFound,
-		wantConfig:  `{}`,
-	}}
-
-	for _, tc := range tests {
-		t.Run(tc.desc, func(t *testing.T) {
-			runTestSet(t, model, tc)
-		})
-	}
-}
-
-func TestUpdate(t *testing.T) {
-	tests := []gnmiSetTestCase{{
-		desc: "update leaf node",
-		initConfig: `{
-			"system": {
-				"config": {
-					"hostname": "switch_a"
-				}
-			}
-		}`,
-		op: pb.UpdateResult_UPDATE,
-		textPbPath: `
-			elem: <name: "system" >
-			elem: <name: "config" >
-			elem: <name: "domain-name" >
-		`,
-		val: &pb.TypedValue{
-			Value: &pb.TypedValue_StringVal{StringVal: "foo.bar.com"},
-		},
-		wantRetCode: codes.OK,
-		wantConfig: `{
-			"system": {
-				"config": {
-					"domain-name": "foo.bar.com",
-					"hostname": "switch_a"
-				}
-			}
-		}`,
-	}, {
-		desc: "update subtree",
-		initConfig: `{
-			"system": {
-				"config": {
-					"hostname": "switch_a"
-				}
-			}
-		}`,
-		op: pb.UpdateResult_UPDATE,
-		textPbPath: `
-			elem: <name: "system" >
-			elem: <name: "config" >
-		`,
-		val: &pb.TypedValue{
-			Value: &pb.TypedValue_JsonIetfVal{
-				JsonIetfVal: []byte(`{"domain-name": "foo.bar.com", "hostname": "switch_a"}`),
-			},
-		},
-		wantRetCode: codes.OK,
-		wantConfig: `{
-			"system": {
-				"config": {
-					"domain-name": "foo.bar.com",
-					"hostname": "switch_a"
-				}
-			}
-		}`,
-	}}
-
-	for _, tc := range tests {
-		t.Run(tc.desc, func(t *testing.T) {
-			runTestSet(t, model, tc)
-		})
-	}
-}
-
-func runTestSet(t *testing.T, m *Model, tc gnmiSetTestCase) {
-	// Create a new server with empty config
-	s, err := NewServer(m, []byte(tc.initConfig), nil)
-	if err != nil {
-		t.Fatalf("error in creating config server: %v", err)
-	}
-
-	// Send request
-	var pbPath pb.Path
-	if err := proto.UnmarshalText(tc.textPbPath, &pbPath); err != nil {
-		t.Fatalf("error in unmarshaling path: %v", err)
-	}
-	var req *pb.SetRequest
-	switch tc.op {
-	case pb.UpdateResult_DELETE:
-		req = &pb.SetRequest{Delete: []*pb.Path{&pbPath}}
-	case pb.UpdateResult_REPLACE:
-		req = &pb.SetRequest{Replace: []*pb.Update{{Path: &pbPath, Val: tc.val}}}
-	case pb.UpdateResult_UPDATE:
-		req = &pb.SetRequest{Update: []*pb.Update{{Path: &pbPath, Val: tc.val}}}
-	default:
-		t.Fatalf("invalid op type: %v", tc.op)
-	}
-	_, err = s.Set(nil, req)
-
-	// Check return code
-	gotRetStatus, ok := status.FromError(err)
-	if !ok {
-		t.Fatal("got a non-grpc error from grpc call")
-	}
-	if gotRetStatus.Code() != tc.wantRetCode {
-		t.Fatalf("got return code %v, want %v\nerror message: %v", gotRetStatus.Code(), tc.wantRetCode, err)
-	}
-
-	// Check server config
-	wantConfigStruct, err := m.NewConfigStruct([]byte(tc.wantConfig))
-	if err != nil {
-		t.Fatalf("wantConfig data cannot be loaded as a config struct: %v", err)
-	}
-	wantConfigJSON, err := ygot.ConstructIETFJSON(wantConfigStruct, &ygot.RFC7951JSONConfig{})
-	if err != nil {
-		t.Fatalf("error in constructing IETF JSON tree from wanted config: %v", err)
-	}
-	gotConfigJSON, err := ygot.ConstructIETFJSON(s.config, &ygot.RFC7951JSONConfig{})
-	if err != nil {
-		t.Fatalf("error in constructing IETF JSON tree from server config: %v", err)
-	}
-	if !reflect.DeepEqual(gotConfigJSON, wantConfigJSON) {
-		t.Fatalf("got server config %v\nwant: %v", gotConfigJSON, wantConfigJSON)
-	}
-}
diff --git a/forks/google/gnmi/util.go b/forks/google/gnmi/util.go
deleted file mode 100644
index 73d17b49f..000000000
--- a/forks/google/gnmi/util.go
+++ /dev/null
@@ -1,102 +0,0 @@
-package gnmi
-
-import (
-	"fmt"
-	"strconv"
-
-	"github.com/openconfig/goyang/pkg/yang"
-	log "github.com/sirupsen/logrus"
-
-	pb "github.com/openconfig/gnmi/proto/gnmi"
-)
-
-// getChildNode gets a node's child with corresponding schema specified by path
-// element. If not found and createIfNotExist is set as true, an empty node is
-// created and returned.
-func getChildNode(node map[string]interface{}, schema *yang.Entry, elem *pb.PathElem, createIfNotExist bool) (interface{}, *yang.Entry) {
-	var nextSchema *yang.Entry
-	var ok bool
-
-	if nextSchema, ok = schema.Dir[elem.Name]; !ok {
-		return nil, nil
-	}
-
-	var nextNode interface{}
-	if elem.GetKey() == nil {
-		if nextNode, ok = node[elem.Name]; !ok {
-			if createIfNotExist {
-				node[elem.Name] = make(map[string]interface{})
-				nextNode = node[elem.Name]
-			}
-		}
-		return nextNode, nextSchema
-	}
-
-	nextNode = getKeyedListEntry(node, elem, createIfNotExist)
-	return nextNode, nextSchema
-}
-
-// getKeyedListEntry finds the keyed list entry in node by the name and key of
-// path elem. If entry is not found and createIfNotExist is true, an empty entry
-// will be created (the list will be created if necessary).
-func getKeyedListEntry(node map[string]interface{}, elem *pb.PathElem, createIfNotExist bool) map[string]interface{} {
-	curNode, ok := node[elem.Name]
-	if !ok {
-		if !createIfNotExist {
-			return nil
-		}
-
-		// Create a keyed list as node child and initialize an entry.
-		m := make(map[string]interface{})
-		for k, v := range elem.Key {
-			m[k] = v
-			if vAsNum, err := strconv.ParseFloat(v, 64); err == nil {
-				m[k] = vAsNum
-			}
-		}
-		node[elem.Name] = []interface{}{m}
-		return m
-	}
-
-	// Search entry in keyed list.
-	keyedList, ok := curNode.([]interface{})
-	if !ok {
-		return nil
-	}
-	for _, n := range keyedList {
-		m, ok := n.(map[string]interface{})
-		if !ok {
-			log.Errorf("wrong keyed list entry type: %T", n)
-			return nil
-		}
-		keyMatching := true
-		// must be exactly match
-		for k, v := range elem.Key {
-			attrVal, ok := m[k]
-			if !ok {
-				return nil
-			}
-			if v != fmt.Sprintf("%v", attrVal) {
-				keyMatching = false
-				break
-			}
-		}
-		if keyMatching {
-			return m
-		}
-	}
-	if !createIfNotExist {
-		return nil
-	}
-
-	// Create an entry in keyed list.
-	m := make(map[string]interface{})
-	for k, v := range elem.Key {
-		m[k] = v
-		if vAsNum, err := strconv.ParseFloat(v, 64); err == nil {
-			m[k] = vAsNum
-		}
-	}
-	node[elem.Name] = append(keyedList, m)
-	return m
-}
diff --git a/go.mod b/go.mod
index 46040747c..dea957b40 100644
--- a/go.mod
+++ b/go.mod
@@ -4,24 +4,20 @@ go 1.16
 
 require (
 	code.fbi.h-da.de/danet/api v0.2.4
+	code.fbi.h-da.de/danet/forks/goarista v0.0.0-20210709163519-47ee8958ef40
+	code.fbi.h-da.de/danet/forks/google v0.0.0-20210709163519-47ee8958ef40
 	code.fbi.h-da.de/danet/yang-models v0.0.8
-	github.com/aristanetworks/goarista v0.0.0-20201120222254-94a892eb0c6a
 	github.com/docker/docker v20.10.6+incompatible
-	github.com/golang/protobuf v1.5.2
-	github.com/google/gnxi v0.0.0-20210423111716-4b504ef806a7
 	github.com/google/uuid v1.2.0
 	github.com/imdario/mergo v0.3.11 // indirect
-	github.com/neo4j/neo4j-go-driver v1.8.3
-	github.com/onsi/gomega v1.10.3 // indirect
-	github.com/openconfig/gnmi v0.0.0-20210527163611-d3a3e30199da
-	github.com/openconfig/goyang v0.2.4
-	github.com/openconfig/ygot v0.10.13
+	github.com/openconfig/gnmi v0.0.0-20210707145734-c69a5df04b53
+	github.com/openconfig/goyang v0.2.7
+	github.com/openconfig/ygot v0.11.2
 	github.com/sirupsen/logrus v1.8.1
 	github.com/spf13/cobra v1.1.3
 	github.com/spf13/viper v1.7.1
 	github.com/stretchr/testify v1.7.0
-	golang.org/x/net v0.0.0-20210614182718-04defd469f4e
-	google.golang.org/grpc v1.38.0
+	google.golang.org/grpc v1.39.0
 	google.golang.org/protobuf v1.26.0
 	k8s.io/api v0.21.0
 	k8s.io/apimachinery v0.21.0
diff --git a/go.sum b/go.sum
index cd6ac3849..3e7505bbd 100644
--- a/go.sum
+++ b/go.sum
@@ -8,234 +8,189 @@ cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg
 cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
 cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
 cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
-cloud.google.com/go v0.54.0 h1:3ithwDMr7/3vpAMXiH+ZQnYbuIsh+OPhUPMFC9enmn0=
 cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
 cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
 cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
-cloud.google.com/go/bigquery v1.4.0 h1:xE3CPsOgttP4ACBePh79zTKALtXwn/Edhcr16R5hMWU=
 cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
 cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
-cloud.google.com/go/datastore v1.1.0 h1:/May9ojXjRkPBNVrq+oWLqmWCkr4OU5uRY29bu0mRyQ=
 cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
-cloud.google.com/go/firestore v1.1.0 h1:9x7Bx0A9R5/M9jibeJeZWqjeVEIxYW9fZYqB9a70/bY=
 cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
 cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
 cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
-cloud.google.com/go/pubsub v1.2.0 h1:Lpy6hKgdcl7a3WGSfJIFmxmcdjSpP6OmBEfcOv1Y680=
 cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
 cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
 cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
-cloud.google.com/go/storage v1.6.0 h1:UDpwYIwla4jHGzZJaEJYx1tOejbgSoNqsAfHAUYe2r8=
 cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
 code.fbi.h-da.de/danet/api v0.2.4 h1:0fQJ1HEib3auseRxmtL03taBsjqjhmXnQNIm+w05FwY=
 code.fbi.h-da.de/danet/api v0.2.4/go.mod h1:kjazkgCFLje+z4BBNBLlyozhQUnkJd0sqlZz1Axe0wM=
+code.fbi.h-da.de/danet/forks/goarista v0.0.0-20210709163519-47ee8958ef40 h1:x7rVYGqfJSMWuYBp+JE6JVMcFP03Gx0mnR2ftsgqjVI=
+code.fbi.h-da.de/danet/forks/goarista v0.0.0-20210709163519-47ee8958ef40/go.mod h1:uVe3gCeF2DcIho8K9CIO46uAkHW/lUF+fAaUX1vHrF0=
+code.fbi.h-da.de/danet/forks/google v0.0.0-20210709163519-47ee8958ef40 h1:B45k5tGEdjjdsKK4f+0dQoyReFmsWdwYEzHofA7DPM8=
+code.fbi.h-da.de/danet/forks/google v0.0.0-20210709163519-47ee8958ef40/go.mod h1:Uutdj5aA3jpzfNm3C8gt2wctYE6cRrdyZsILUgJ+tMY=
 code.fbi.h-da.de/danet/yang-models v0.0.8 h1:LuKt58Zh2mDkQa9s4hFaIANtZLxES7EFX1rIczD0GDs=
 code.fbi.h-da.de/danet/yang-models v0.0.8/go.mod h1:aoz0hgHZoEm2Apu9kA93g9nIBjAApBvx4pMFj2gbx9g=
-dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY=
 dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
-github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs=
 github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
-github.com/Azure/go-autorest/autorest v0.11.12 h1:gI8ytXbxMfI+IVbI9mP2JGCTXIuhHLgRlvQ9X4PsnHE=
 github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw=
-github.com/Azure/go-autorest/autorest/adal v0.9.5 h1:Y3bBUV4rTuxenJJs41HU3qmqsb+auo+a3Lz+PlJPpL0=
 github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A=
-github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw=
 github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74=
-github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk=
 github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
-github.com/Azure/go-autorest/logger v0.2.0 h1:e4RVHVZKC5p6UANLJHkM4OfR1UKZPj8Wt8Pcx+3oqrE=
 github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
-github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo=
 github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
-github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
-github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc=
 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
-github.com/Microsoft/go-winio v0.4.15 h1:qkLXKzb1QoVatRyd/YlXZ/Kg0m5K3SPuoD82jjSOaBc=
+github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
 github.com/Microsoft/go-winio v0.4.15/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw=
-github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46 h1:lsxEuwrXEAokXB9qhlbKWPpo3KMLZQ5WB5WLQRW1uq0=
 github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
-github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE=
 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
-github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
 github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
-github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
 github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
-github.com/Shopify/sarama v1.26.1 h1:3jnfWKD7gVwbB1KSy/lE0szA9duPuSFLViK0o/d3DgA=
-github.com/Shopify/sarama v1.26.1/go.mod h1:NbSGBSSndYaIhRcBtY9V0U7AyH+x71bG668AuWys/yU=
-github.com/Shopify/toxiproxy v2.1.4+incompatible h1:TKdv8HiTLgE5wdJuEML90aBgNWsokNbMijUGhmcoBJc=
+github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
+github.com/Shopify/sarama v1.28.0/go.mod h1:j/2xTrU39dlzBmsxF1eQ2/DdWrxyBCl6pzz7a81o/ZY=
 github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
+github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
+github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c=
 github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
-github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM=
 github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
-github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4 h1:Hs82Z41s6SdL1CELW+XaDYmOH4hkBN4/N9og/AsOv7E=
 github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
 github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y=
-github.com/andybalholm/brotli v1.0.1 h1:KqhlKozYbRtJvsPrrEeXcO+N2l6NYT5A2QAFmSULpEc=
 github.com/andybalholm/brotli v1.0.1/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y=
-github.com/aristanetworks/fsnotify v1.4.2 h1:it2ydpY6k0aXB7qjb4vGhOYOL6YDC/sr8vhqwokFQwQ=
+github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
+github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
+github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
 github.com/aristanetworks/fsnotify v1.4.2/go.mod h1:D/rtu7LpjYM8tRJphJ0hUBYpjai8SfX+aSNsWDTq/Ks=
-github.com/aristanetworks/glog v0.0.0-20191112221043-67e8567f59f3 h1:Bmjk+DjIi3tTAU0wxGaFbfjGUqlxxSXARq9A96Kgoos=
 github.com/aristanetworks/glog v0.0.0-20191112221043-67e8567f59f3/go.mod h1:KASm+qXFKs/xjSoWn30NrWBBvdTTQq+UjkhjEJHfSFA=
-github.com/aristanetworks/goarista v0.0.0-20201120222254-94a892eb0c6a h1:R7ghEBfKIqu/SDpGHS9Nj1fWPxkvxh6Lv4Wq6eS95G4=
-github.com/aristanetworks/goarista v0.0.0-20201120222254-94a892eb0c6a/go.mod h1:Q4lsGfepQE823ePrSNr2CjCz1oeeMECJ6k1yBVujrZg=
-github.com/aristanetworks/splunk-hec-go v0.3.3 h1:O7zlcm4ve7JvqTyEK3vSBh1LngLezraqcxv8Ya6tQFY=
+github.com/aristanetworks/goarista v0.0.0-20210706081233-a582b785a9ce h1:oKfxZ+MdgljqTE33vdUuIUUXQp3VFH9yqqgxCRyB48w=
+github.com/aristanetworks/goarista v0.0.0-20210706081233-a582b785a9ce/go.mod h1:drswc1gdKErwWsW+gV2R5ELcuHehg5pZD2tat4B65Ik=
 github.com/aristanetworks/splunk-hec-go v0.3.3/go.mod h1:1VHO9r17b0K7WmOlLb9nTk/2YanvOEnLMUgsFrxBROc=
-github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e h1:QEF07wC0T1rKkctt1RINW/+RMTVmiwxETico2l3gxJA=
 github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
-github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=
 github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
-github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310 h1:BUAU3CGlLvorLI26FmByPp2eC2qla6E1Tw+scpcg/to=
 github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
-github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA=
+github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A=
 github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
+github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU=
+github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
+github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
 github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
-github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
 github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
-github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY=
 github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
-github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c h1:+0HFd5KSZ/mm3JmhmrDukiId5iR6w4+BdFtfSy4yWIc=
 github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
-github.com/cenkalti/backoff/v4 v4.0.0 h1:6VeaLF9aI+MAUQ95106HwWzYZgJJpZ4stumjj6RFYAU=
+github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ=
+github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
 github.com/cenkalti/backoff/v4 v4.0.0/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg=
-github.com/census-instrumentation/opencensus-proto v0.2.1 h1:glEXhBS5PSLLv4IXzLA5yPRVX4bilULVyxxbrfOtDAk=
+github.com/cenkalti/backoff/v4 v4.1.0/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
-github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
 github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
-github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
 github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
-github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE=
 github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
-github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8=
 github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
-github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8=
 github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
-github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI=
+github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE=
 github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
 github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
-github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403 h1:cqQfy1jclcSy/FwLjemeg3SR1yaINm74aQyupQ0Bl8M=
 github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
-github.com/coreos/bbolt v1.3.2 h1:wZwiHHUieZCquLkDL0B8UhzreNWsPHooDAG3q34zk0s=
+github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
+github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
 github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
-github.com/coreos/etcd v3.3.13+incompatible h1:8F3hqu9fGYLBifCmRCJsicFqDx/D68Rt3q1JMazcgBQ=
 github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
-github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM=
+github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
 github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
-github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8=
+github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
 github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
-github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg=
+github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
 github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
-github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM=
+github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
 github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
-github.com/creack/pty v1.1.9 h1:uDmaGzcdjhF4i/plgjmEsriH11Y0o7RKapEf/LDaM3w=
+github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
 github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
 github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
-github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954 h1:RMLoZVzv4GliuWafOuPuQDKSm1SJph7uCRnnS61JAn4=
 github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
-github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug=
 github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
 github.com/docker/docker v1.13.1/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
 github.com/docker/docker v20.10.6+incompatible h1:oXI3Vas8TI8Eu/EjH4srKHJBVqraSzJybhxY7Om9faQ=
 github.com/docker/docker v20.10.6+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
-github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=
 github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
-github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw=
 github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
-github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815 h1:bWDMxwH3px2JBh6AyO7hdCn/PkvCZXii8TGj7sbtEbQ=
 github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
-github.com/dsnet/compress v0.0.1 h1:PlZu0n3Tuv04TzpfPbrnI0HW/YwodEXDS+oPKahKF0Q=
 github.com/dsnet/compress v0.0.1/go.mod h1:Aw8dCMJ7RioblQeTqt88akK31OvO8Dhf5JflhBbQEHo=
-github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780 h1:tFh1tRc4CA31yP6qDcu+Trax5wW5GuMxvkIba07qVLY=
 github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY=
-github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
+github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
 github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
-github.com/eapache/go-resiliency v1.2.0 h1:v7g92e/KSN71Rq7vSThKaWIq68fL4YHvWyiUKorFR1Q=
+github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
 github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
-github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 h1:YEetp8/yCZMuEPMUDHG0CW/brkkEp8mzqk2+ODEitlw=
 github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
-github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc=
 github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
-github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153 h1:yUdfgN0XgIJw7foRItutHYUIhlcKzcSf5vDpdhQAKTc=
+github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
 github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
-github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633 h1:H2pdYOb3KQ1/YsqVWoWNLQO+fusocsw354rqGTZtAgw=
 github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
+github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=
 github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
 github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
-github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d h1:QyzYnTnPE15SQyUeqU6qLbWxMkwyAyu+vGksa0b7j00=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
 github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
-github.com/envoyproxy/protoc-gen-validate v0.1.0 h1:EQciDnbrYxy13PgWoY8AqoxGiPrpgBZ1R8UNe3ddc+A=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
 github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
-github.com/evanphx/json-patch v4.9.0+incompatible h1:kLcOMZeuLAJvL2BPWLMIj5oaZQobrkAqrL+WFZwQses=
 github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
-github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys=
 github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
-github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk=
 github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
-github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw=
 github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
-github.com/frankban/quicktest v1.7.2 h1:2QxQoC1TS09S7fhCPsrvqYdvP1H5M1P1ih5ABm3BTYk=
-github.com/frankban/quicktest v1.7.2/go.mod h1:jaStnuzAqU1AJdCO0l53JDCJrVDKcS03DbaAcR7Ks/o=
+github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4=
+github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20=
+github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
 github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
-github.com/garyburd/redigo v1.6.0 h1:0VruCpn7yAIIu7pWVClQC8wxCJEcG3nyzpMSHKi1PQc=
 github.com/garyburd/redigo v1.6.0/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
-github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
 github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
-github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo6zf912W/a6Sr4Eu0G/3Jho0=
 github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
-github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4 h1:WtGNWLvXpe6ZudgnXrq0barxBImvnnJoMEhXAzcbM0I=
 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
-github.com/go-kit/kit v0.9.0 h1:wDJmvq38kDhkVxi50ni9ykkdUr1PKgqKOoi01fa0Mdk=
 github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o=
 github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
-github.com/go-logfmt/logfmt v0.4.0 h1:MP4Eh7ZCb31lleYCFuwm0oe4/YGak+5l1vA2NOE80nA=
 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
 github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
 github.com/go-logr/logr v0.4.0 h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc=
 github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
 github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
-github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w=
 github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
 github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
-github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o=
 github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=
-github.com/go-openapi/spec v0.19.3 h1:0XRyw8kguri6Yw4SxhsQA/atC88yqrk0+G4YhI2wabc=
 github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo=
 github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
-github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY=
 github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
-github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
+github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
 github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
 github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
 github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
 github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
 github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY=
 github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
 github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
 github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
-github.com/golang/mock v1.4.3 h1:GV+pQPG/EUUbkh47niozDcADz6go/dUwhVzdUQHIVRw=
-github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
 github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@@ -252,11 +207,11 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw
 github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
 github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
 github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-github.com/golang/snappy v0.0.2 h1:aeE13tS0IiQgFjYdoL8qN3K1N2bXXtI6Vi51/y7BpMw=
 github.com/golang/snappy v0.0.2/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
-github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo=
 github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/gnxi v0.0.0-20210423111716-4b504ef806a7 h1:cJ62uhbZcclaYm9gq4JNyazqSY7bUEggwZdw0nHTT7o=
 github.com/google/gnxi v0.0.0-20210423111716-4b504ef806a7/go.mod h1:dPTuHPVOqxZ2yGKPjymiMt1vrZa8KHXWKX+Lx1z5d88=
@@ -268,183 +223,158 @@ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
 github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
 github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g=
 github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
-github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no=
 github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
 github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
 github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
 github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
 github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3 h1:SRgJV+IoxM5MKyFdlSUeNy6/ycRUF2yBAKdAQswoHUk=
 github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
 github.com/google/protobuf v3.11.4+incompatible/go.mod h1:lUQ9D1ePzbH2PrIS7ob/bjm9HXyH5WHB0Akwh7URreM=
-github.com/google/protobuf v3.14.0+incompatible h1:rSTMM21bjNyK54KsPMno/qZY2q17Mh14wc3gOdfBudU=
 github.com/google/protobuf v3.14.0+incompatible/go.mod h1:lUQ9D1ePzbH2PrIS7ob/bjm9HXyH5WHB0Akwh7URreM=
-github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA=
 github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs=
 github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
-github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM=
 github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
 github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I=
 github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg=
 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
 github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 h1:l5lAOZEym3oK3SQ2HBHWsJUfbNBiTXJDeW2QDxw9AQ0=
 github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
-github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
+github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
+github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
+github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
 github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
-github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
+github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4=
+github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM=
+github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
 github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
-github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 h1:pdN6V1QBWetyv/0+wjACpqVH+eVULgEjkurDLq3goeM=
 github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
-github.com/grpc-ecosystem/go-grpc-middleware v1.0.0 h1:Iju5GlWwrvL6UBg4zJJt3btmonfrMlCDdsejg4CZE7c=
 github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
-github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho=
+github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
-github.com/grpc-ecosystem/grpc-gateway v1.9.0 h1:bM6ZAFZmc/wPFaRDi0d5L7hGEZEx/2u+Tmr2evNHDiI=
 github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
-github.com/hashicorp/consul/api v1.1.0 h1:BNQPM9ytxj6jbjjdRPioQ94T6YXriSopn0i8COv6SRA=
+github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
+github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
 github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
-github.com/hashicorp/consul/sdk v0.1.1 h1:LnuDWGNsoajlhGyHJvuWW6FVqRl8JOTPqS6CPTsYjhY=
+github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE=
 github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
-github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=
+github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
 github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
-github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=
 github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
-github.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=
 github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
-github.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=
 github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
-github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o=
 github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
-github.com/hashicorp/go-rootcerts v1.0.0 h1:Rqb66Oo1X/eSV1x66xbDccZjhJigjg0+e82kpwzSwCI=
 github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
-github.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs=
 github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
-github.com/hashicorp/go-syslog v1.0.0 h1:KaodqZuhUoZereWVIYmpUgZysurB1kBLX2j0MwMrUAE=
 github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
 github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
 github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
-github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=
 github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
-github.com/hashicorp/go.net v0.0.1 h1:sNCoNyDEvN1xa+X0baata4RdcpKwcMS6DH+xwfqPgjw=
+github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
 github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
 github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
-github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU=
 github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
 github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
-github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y=
 github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
-github.com/hashicorp/mdns v1.0.0 h1:WhIgCr5a7AaVH6jPUwjtRuuE7/RDufnUvzIr48smyxs=
 github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
-github.com/hashicorp/memberlist v0.1.3 h1:EmmoJme1matNzb+hMpDuR/0sbJSUisxyqBGG676r31M=
 github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
-github.com/hashicorp/serf v0.8.2 h1:YZ7UKsJv+hKjqGVUUbtE3HNj79Eln2oQ75tniF6iPt0=
 github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
-github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
-github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6 h1:UDMh68UUwekSh5iP2OMhRRZJiiBccgV7axzUG8vi56c=
+github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg=
 github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
 github.com/imdario/mergo v0.3.11 h1:3tnifQM4i+fbajXKBHXWEH+KvNHqojZ778UH75j3bGA=
 github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
 github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
 github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
-github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d h1:/WZQPMZNsjZ7IlCpsLGdQBINg5bxKQ1K1sh6awxLtkA=
 github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
-github.com/jcmturner/gofork v1.0.0 h1:J7uCkflzTEhUZ64xqKnkDxq3kzc96ajM1Gli5ktUem8=
+github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
+github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs=
+github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM=
 github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o=
-github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo=
+github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg=
+github.com/jcmturner/gokrb5/v8 v8.4.2/go.mod h1:sb+Xq/fTY5yktf/VxLsE3wlfPqQjp0aWNYyvBVK62bc=
+github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc=
+github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
 github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
+github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
 github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
-github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
 github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68=
 github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
 github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
-github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o=
 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
 github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
-github.com/julienschmidt/httprouter v1.2.0 h1:TDTW5Yz1mjftljbcKqRcrYhd4XeOoI98t+9HbQbYf7g=
 github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
 github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
-github.com/kisielk/errcheck v1.5.0 h1:e8esj/e4R+SAOwFwN+n3zr0nYeCyeweozKfO23MvHzY=
 github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
-github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg=
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
-github.com/klauspost/compress v1.9.8/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
-github.com/klauspost/compress v1.10.1/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
 github.com/klauspost/compress v1.10.10/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
-github.com/klauspost/compress v1.11.3 h1:dB4Bn0tN3wdCzQxnS8r06kV74qN/TAfaIS0bVE8h3jc=
 github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
+github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
+github.com/klauspost/compress v1.11.9/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
 github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
-github.com/klauspost/cpuid v1.2.3 h1:CCtW0xUnWGVINKvE/WWOYKdsPV6mawAtvQuSl8guwQs=
-github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
+github.com/klauspost/cpuid/v2 v2.0.2/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
+github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
 github.com/klauspost/pgzip v1.2.4/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
-github.com/klauspost/pgzip v1.2.5 h1:qnWYvvKqedOF2ulHpMG72XQol4ILEJ8k2wwRl/Km8oE=
 github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
-github.com/klauspost/reedsolomon v1.9.3 h1:N/VzgeMfHmLc+KHMD1UL/tNkfXAt8FnUqlgXGIduwAY=
-github.com/klauspost/reedsolomon v1.9.3/go.mod h1:CwCi+NUr9pqSVktrkN+Ondf06rkhYZ/pcNv7fu+8Un4=
-github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
+github.com/klauspost/reedsolomon v1.9.11/go.mod h1:nLvuzNvy1ZDNQW30IuMc2ZWCbiqrJgdLoUS2X8HAUVg=
 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
-github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8=
+github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
-github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY=
 github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
-github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs=
 github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
+github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
-github.com/kr/pty v1.1.5 h1:hyz3dwM5QLc1Rfoz4FuWJQG5BN7tc6K1MndAUnGpQr4=
 github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
 github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
 github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
+github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
+github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
+github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
 github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
 github.com/magiconair/properties v1.8.4 h1:8KGKTcQQGm0Kv7vEbKFErAoAOFyyacLStRtQSeYtvkY=
 github.com/magiconair/properties v1.8.4/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
 github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
-github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8=
 github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
-github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4=
 github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
-github.com/mattn/go-isatty v0.0.3 h1:ns/ykhmWi7G9O+8a448SecJU3nSMBXJfqQkl0upE1jI=
 github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
-github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
+github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
+github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
 github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
-github.com/mholt/archiver/v3 v3.5.0 h1:nE8gZIrw66cu4osS/U7UW7YDuGMHssxKutU8IfWxwWE=
 github.com/mholt/archiver/v3 v3.5.0/go.mod h1:qqTTPUK/HZPFgFQ/TJ3BzvTpF/dPtFVJXdQbCmeMxwc=
-github.com/miekg/dns v1.0.14 h1:9jZdLNd/P4+SfEJ0TNyxYpsK8N4GtfylBLqtbYN1sbA=
 github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
-github.com/mitchellh/cli v1.0.0 h1:iGBIsUe3+HZ/AD/Vd7DErOt5sU9fa8Uj7A2s1aggv1Y=
 github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
 github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
-github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
 github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
-github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0=
 github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
-github.com/mitchellh/gox v0.4.0 h1:lfGJxY7ToLJQjHHwi0EX6uYBdK78egf954SQl13PQJc=
 github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
-github.com/mitchellh/iochan v1.0.0 h1:C+X3KsSTLFVBr/tK1eYN/vs4rJcvsiLU338UhYPJWeY=
 github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
 github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 github.com/mitchellh/mapstructure v1.3.3 h1:SzB1nHZ2Xi+17FP0zVQBHIZqvwRN9408fJO8h+eeNA8=
 github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
-github.com/moby/moby v1.13.1 h1:mC5WwQwCXt/dYxZ1cIrRsnJAWw7VdtcTZUIGr4tXzOM=
 github.com/moby/moby v1.13.1/go.mod h1:fDXVQ6+S340veQPv35CzDahGBmHsiclFwfEygB/TWMc=
-github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8=
 github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c=
 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
@@ -452,124 +382,130 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ
 github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
 github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
 github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
-github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d h1:7PxY7LVfSZm7PEeBTyK1rj1gABdCO2mbri6GKO1cMDs=
 github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
-github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223 h1:F9x/1yl3T2AeKLr2AMdilSD8+f9bvMnNN8VS5iDtovc=
 github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
-github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus=
+github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
 github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=
-github.com/neo4j/neo4j-go-driver v1.8.3 h1:yfuo9YBAlezdIiogu92GwEir/81RD81dNwS5mY/wAIk=
-github.com/neo4j/neo4j-go-driver v1.8.3/go.mod h1:ncO5VaFWh0Nrt+4KT4mOZboaczBZcLuHrG+/sUeP8gI=
-github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
+github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg=
+github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU=
+github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k=
+github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w=
+github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
+github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
+github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
-github.com/nwaples/rardecode v1.1.0 h1:vSxaY8vQhOcVr4mm5e8XllHWTiM4JF507A0Katqw7MQ=
 github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0=
-github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
-github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
-github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4=
+github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs=
+github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
 github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
+github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
 github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
-github.com/onsi/ginkgo v1.12.1 h1:mFwc4LvZ0xpSvDZ3E+k8Yte0hLOMxXUlP+yXtJqkYfQ=
-github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
 github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
+github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
 github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
-github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
-github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
-github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA=
-github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=
-github.com/openconfig/gnmi v0.0.0-20190823184014-89b2bf29312c/go.mod h1:t+O9It+LKzfOAhKTT5O0ehDix+MTqbtT0T9t+7zzOvc=
+github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
 github.com/openconfig/gnmi v0.0.0-20200414194230-1597cc0f2600/go.mod h1:M/EcuapNQgvzxo1DDXHK4tx3QpYM/uG4l591v33jG2A=
 github.com/openconfig/gnmi v0.0.0-20200508230933-d19cebf5e7be/go.mod h1:M/EcuapNQgvzxo1DDXHK4tx3QpYM/uG4l591v33jG2A=
 github.com/openconfig/gnmi v0.0.0-20200617225440-d2b4e6a45802/go.mod h1:M/EcuapNQgvzxo1DDXHK4tx3QpYM/uG4l591v33jG2A=
-github.com/openconfig/gnmi v0.0.0-20210527163611-d3a3e30199da h1:Gaj4Reje4wKdliTXaXDE7ginHeVzDbcUTszUx6xpQeE=
+github.com/openconfig/gnmi v0.0.0-20210226144353-8eae1937bf84/go.mod h1:H/20NXlnWbCPFC593nxpiKJ+OU//7mW7s7Qk7uVdg3Q=
 github.com/openconfig/gnmi v0.0.0-20210527163611-d3a3e30199da/go.mod h1:H/20NXlnWbCPFC593nxpiKJ+OU//7mW7s7Qk7uVdg3Q=
+github.com/openconfig/gnmi v0.0.0-20210707145734-c69a5df04b53 h1:xT/AVinvSf+uP/amEFrU1JJYBZXqikEyNtBPnfyefoE=
+github.com/openconfig/gnmi v0.0.0-20210707145734-c69a5df04b53/go.mod h1:h365Ifq35G6kLZDQlRvrccTt2LKK90VpjZLMNGxJRYc=
 github.com/openconfig/goyang v0.0.0-20200115183954-d0a48929f0ea/go.mod h1:dhXaV0JgHJzdrHi2l+w0fZrwArtXL7jEFoiqLEdmkvU=
 github.com/openconfig/goyang v0.2.2/go.mod h1:vX61x01Q46AzbZUzG617vWqh/cB+aisc+RrNkXRd3W8=
 github.com/openconfig/goyang v0.2.3/go.mod h1:vX61x01Q46AzbZUzG617vWqh/cB+aisc+RrNkXRd3W8=
-github.com/openconfig/goyang v0.2.4 h1:xGmGr3zuhq9ASCu5jRdtMFdRnixhbg8TJEQ0nylyvxA=
-github.com/openconfig/goyang v0.2.4/go.mod h1:vX61x01Q46AzbZUzG617vWqh/cB+aisc+RrNkXRd3W8=
-github.com/openconfig/gribi v0.1.1-0.20210423184541-ce37eb4ba92f h1:8vRtC+y0xh9BYPrEGf/jG/paYXiDUJ6P8iYt5rCVols=
+github.com/openconfig/goyang v0.2.5/go.mod h1:vX61x01Q46AzbZUzG617vWqh/cB+aisc+RrNkXRd3W8=
+github.com/openconfig/goyang v0.2.7 h1:bWvqXzNekiyHR2eoNE1DWrS3zSQS3aNKl6V+BLQSRSU=
+github.com/openconfig/goyang v0.2.7/go.mod h1:vX61x01Q46AzbZUzG617vWqh/cB+aisc+RrNkXRd3W8=
 github.com/openconfig/gribi v0.1.1-0.20210423184541-ce37eb4ba92f/go.mod h1:OoH46A2kV42cIXGyviYmAlGmn6cHjGduyC2+I9d/iVs=
-github.com/openconfig/reference v0.0.0-20190727015836-8dfd928c9696 h1:yHCGAHg2zMaW8olLrqEt3SAHGcEx2aJPEQWMRCyravY=
-github.com/openconfig/reference v0.0.0-20190727015836-8dfd928c9696/go.mod h1:ym2A+zigScwkSEb/cVQB0/ZMpU3rqiH6X7WRRsxgOGw=
+github.com/openconfig/grpctunnel v0.0.0-20210610163803-fde4a9dc048d/go.mod h1:x9tAZ4EwqCQ0jI8D6S8Yhw9Z0ee7/BxWQX0k0Uib5Q8=
+github.com/openconfig/reference v0.0.0-20201210185750-72ca4cfd4abd/go.mod h1:ym2A+zigScwkSEb/cVQB0/ZMpU3rqiH6X7WRRsxgOGw=
 github.com/openconfig/ygot v0.6.0/go.mod h1:o30svNf7O0xK+R35tlx95odkDmZWS9JyWWQSmIhqwAs=
 github.com/openconfig/ygot v0.9.0/go.mod h1:oCQNdXnv7dWc8scTDgoFkauv1wwplJn5HspHcjlxSAQ=
 github.com/openconfig/ygot v0.10.0/go.mod h1:oCQNdXnv7dWc8scTDgoFkauv1wwplJn5HspHcjlxSAQ=
 github.com/openconfig/ygot v0.10.4/go.mod h1:oCQNdXnv7dWc8scTDgoFkauv1wwplJn5HspHcjlxSAQ=
-github.com/openconfig/ygot v0.10.13 h1:gxbLGbD0zzh/4yOpGt81hBbhQes2GiQeINrrzh65nTE=
-github.com/openconfig/ygot v0.10.13/go.mod h1:NDGFcX73PnipISpF8yuDpwrsOAl6vqqK4mNPvscWzXA=
-github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
+github.com/openconfig/ygot v0.11.2 h1:J5HTV1BtNZoc8LHDUpgA33rhccEIds81S32G2qgIDJY=
+github.com/openconfig/ygot v0.11.2/go.mod h1:5q5fz1SDPGUwMyzbm8Ns2Krul+32euNSU89ZmrGrSK8=
 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
-github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=
+github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
+github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
+github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
+github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
+github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA=
+github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
+github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
+github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
+github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM=
 github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
-github.com/pborman/getopt v0.0.0-20190409184431-ee0cd42419d3 h1:YtFkrqsMEj7YqpIhRteVxJxCeC3jJBieuLr0d4C4rSA=
 github.com/pborman/getopt v0.0.0-20190409184431-ee0cd42419d3/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o=
+github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
 github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
 github.com/pelletier/go-toml v1.8.1 h1:1Nf83orprkJyknT6h7zbuEGUEjcyVlCxSUGTENmNCRM=
 github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc=
-github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI=
+github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac=
 github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
-github.com/pierrec/lz4 v2.4.1+incompatible h1:mFe7ttWaflA46Mhqh+jUfjp2qTbPYxLB2/OyBppH9dg=
-github.com/pierrec/lz4 v2.4.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
+github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
+github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
+github.com/pierrec/lz4 v2.6.0+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
 github.com/pierrec/lz4/v4 v4.0.3/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
-github.com/pierrec/lz4/v4 v4.1.1 h1:cS6aGkNLJr4u+UwaA21yp+gbWN3WJWtKo1axmPDObMA=
 github.com/pierrec/lz4/v4 v4.1.1/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
 github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pkg/sftp v1.10.1 h1:VasscCm72135zRysgrJDKsntdmPN+OuU3+nnHYA9wyc=
+github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA=
 github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/posener/complete v1.1.1 h1:ccV59UEOTzVDnDUEFdT95ZzHVZ+5+158q8+SJb2QV5w=
 github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
 github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
 github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
 github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
-github.com/prometheus/client_golang v1.4.1 h1:FFSuS004yOQEtDdTq+TAOLP5xUq63KqAFYyOi8zA+Y8=
-github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
+github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og=
+github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
+github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU=
 github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
 github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
+github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
+github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
 github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
 github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
-github.com/prometheus/common v0.9.1 h1:KOMtN28tlbam3/7ZKEYKHhKoJZYYj3gMH4uc62x7X7U=
-github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=
+github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA=
+github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
+github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s=
+github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s=
 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
 github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
 github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
 github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
-github.com/prometheus/procfs v0.0.10 h1:QJQN3jYQhkamO4mhfUWqdDH2asK7ONOI9MTWjyAxNKM=
-github.com/prometheus/procfs v0.0.10/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
-github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA=
+github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
+github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
+github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
 github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
-github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563 h1:dY6ETXrvDG7Sa4vE8ZQG4yqWg6UnOcbqTAahkV813vQ=
-github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
-github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af h1:gu+uRPtBe88sKxUCEXRoeCvVG90TJmwhiqRpvdhQFng=
+github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
+github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
 github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
-github.com/rogpeppe/go-internal v1.3.0 h1:RR9dF3JtopPvtkroDZuVD7qquD0bnHlKSqaQhgwt8yk=
+github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
-github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q=
 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
-github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f h1:UFr9zpz4xgTnIE5yIMtWAMngCdZ9p/+q6lTbgelo80M=
 github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
-github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
+github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E=
 github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
-github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=
 github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
-github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo=
 github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
 github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
 github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
 github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
+github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
 github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
 github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
 github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
@@ -577,9 +513,8 @@ github.com/smartystreets/assertions v1.2.0 h1:42S6lae5dvLc7BrLu/0ugRtcFVjoJNMC/N
 github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=
 github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
 github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
-github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E=
 github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
-github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ=
+github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY=
 github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
 github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
 github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
@@ -588,6 +523,7 @@ github.com/spf13/afero v1.4.1/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z
 github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
 github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng=
 github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
+github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
 github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI=
 github.com/spf13/cobra v1.1.3 h1:xghbfqPkxzxP3C/f3n5DdpAbdKLj4ZE4BWQI362l53M=
 github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo=
@@ -595,12 +531,16 @@ github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb6
 github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
 github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
 github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
 github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
 github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
 github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk=
 github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
+github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
+github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
+github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48=
@@ -614,61 +554,57 @@ github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5Cc
 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
 github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
-github.com/templexxx/cpufeat v0.0.0-20180724012125-cef66df7f161 h1:89CEmDvlq/F7SJEOqkIdNDGJXrQIhuIx9D2DBXjavSU=
 github.com/templexxx/cpufeat v0.0.0-20180724012125-cef66df7f161/go.mod h1:wM7WEvslTq+iOEAMDLSzhVuOt5BRZ05WirO+b09GHQU=
-github.com/templexxx/xor v0.0.0-20191217153810-f85b25db303b h1:fj5tQ8acgNUr6O8LEplsxDhUIe2573iLkJc+PqnzZTI=
 github.com/templexxx/xor v0.0.0-20191217153810-f85b25db303b/go.mod h1:5XA7W9S6mni3h5uvOC75dA3m9CCCaS83lltmc0ukdi4=
-github.com/tjfoc/gmsm v1.3.0 h1:i7c6Za/IlgBvnGxYpfD7L3TGuaS+v6oGcgq+J9/ecEA=
-github.com/tjfoc/gmsm v1.3.0/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w=
-github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ=
+github.com/tjfoc/gmsm v1.4.0/go.mod h1:j4INPkHWMrhJb38G+J6W4Tw0AbuN8Thu3PbdVYhVcTE=
+github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8=
 github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
-github.com/ulikunitz/xz v0.5.8 h1:ERv8V6GKqVi23rgu5cj9pVfVzJbOqAY2Ntl88O6c2nQ=
 github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
-github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c h1:u40Z8hqBAAQyv+vATcGgV0YCnDjqSL7/q/JyPhhJSPk=
+github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
+github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
 github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I=
-github.com/xdg/stringprep v1.0.0 h1:d9X0esnoa3dFsV0FG35rAT0RIhYFlPq7MiP+DW89La0=
 github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
-github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo=
 github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos=
-github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8=
 github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
-github.com/xtaci/kcp-go v5.4.20+incompatible h1:TN1uey3Raw0sTz0Fg8GkfM0uH3YwzhnZWQ1bABv5xAg=
 github.com/xtaci/kcp-go v5.4.20+incompatible/go.mod h1:bN6vIwHQbfHaHtFpEssmWsN45a+AZwO7eyRCmEIbtvE=
-github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae h1:J0GxkO96kL4WF+AIT3M4mfUVinOCPgf2uUWYFUzN0sM=
 github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae/go.mod h1:gXtu8J62kEgmN++bm9BVICuT/e8yiLI2KFobd/TRFsE=
 github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-github.com/yuin/goldmark v1.2.1 h1:ruQGxdhGHe7FWOJPT0mKs5+pD2Xs1Bm/kdGlHO04FmM=
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-go.etcd.io/bbolt v1.3.2 h1:Z/90sZLPOeCy2PwprqkFa25PdkusRzaj9P8zm/KNyvk=
 go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
+go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
+go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg=
+go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
+go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
 go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
 go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
 go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
-go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8=
 go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
-go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU=
+go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
+go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
 go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
-go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI=
+go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
 go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
-go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM=
+go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
+go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
 go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
+go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
 golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20191219195013-becbf705a915/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20200204104054-c9f3fb736b72/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 h1:/ZScEX8SfEmUGRHs0gxpqteO5nfNW6axyZbBdw9A12g=
+golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
 golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@@ -679,10 +615,8 @@ golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u0
 golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
-golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6 h1:QE6XYQK6naiK1EPAe1g/ILLxN5RBoH5xkJk3CqlMI/Y=
 golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
 golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
-golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4=
 golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
 golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
@@ -693,17 +627,14 @@ golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHl
 golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
 golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
-golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k=
 golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
 golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
-golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs=
 golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
 golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
 golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
 golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
 golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
 golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4=
 golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -713,6 +644,7 @@ golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73r
 golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
@@ -722,6 +654,7 @@ golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR
 golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
@@ -731,11 +664,15 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL
 golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
 golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20201216054612-986b41b23924/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=
 golang.org/x/net v0.0.0-20210614182718-04defd469f4e h1:XpT3nA5TvE525Ne3hInMh6+GETgn27Zfm9dxsThnX2Q=
 golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
@@ -751,8 +688,9 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9 h1:SQFwaSi55rU7vdNs9Yr0Z324VNlrF+0wMqRXT4St8ck=
 golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -760,6 +698,7 @@ golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5h
 golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -770,27 +709,32 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200219091948-cb0a6d8edb6c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210423082822-04245dca01da h1:b3NXsE2LusjYGGjL5bxEVZZORm/YEFFrWFjR8eFrw/c=
 golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -804,14 +748,17 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE=
 golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
@@ -829,6 +776,8 @@ golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgw
 golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
@@ -837,23 +786,24 @@ golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtn
 golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200221224223-e1da425f72fd/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
 golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20210106214847-113979e3529a h1:CB3a9Nez8M13wwlr/E2YtwoU+qYHKfC+JrDa45RXXoQ=
 golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
 google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
 google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
 google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
@@ -863,9 +813,9 @@ google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsb
 google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
 google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
 google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.20.0 h1:jz2KixHX7EcCPiQrySzPdnYT7DbINAypCqKZ1Z7GM40=
 google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
 google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
@@ -876,6 +826,7 @@ google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRn
 google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s=
 google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
 google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
 google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
@@ -889,25 +840,36 @@ google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4
 google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
 google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
 google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
 google.golang.org/genproto v0.0.0-20200519141106-08726f379972/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
 google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
-google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d h1:HV9Z9qMhQEsdlvxNFELgQ11RkMzO3CMkjEySjCtuLes=
 google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb h1:hcskBH5qZCOa7WpTUFUFvoebnSFZBYpjykLtjIp9DVk=
+google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM=
 google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
+google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
 google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
+google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
 google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
 google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
 google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
 google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
 google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
 google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
+google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
 google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=
+google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
 google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
-google.golang.org/grpc v1.38.0 h1:/9BgsAsa5nWe26HqOlvlgJnqBuktYOLCgjCPqsa56W0=
 google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
-google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.0.1 h1:M8spwkmx0pHrPq+uMdl22w5CvJ/Y+oAJTIs9oGoCpOE=
+google.golang.org/grpc v1.39.0 h1:Klz8I9kdtkIN6EpHHUOMLCYhTn/2WAe5a0s1hcBkdTI=
+google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.0.1/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
+google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
 google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
 google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
@@ -921,44 +883,32 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba
 google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
 google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk=
 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc=
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
-gopkg.in/bsm/ratelimit.v1 v1.0.0-20160220154919-db14e161995a h1:stTHdEoWg1pQ8riaP5ROrjS6zy6wewH/Q2iwnLCQUXY=
 gopkg.in/bsm/ratelimit.v1 v1.0.0-20160220154919-db14e161995a/go.mod h1:KF9sEfUPAXdG8Oev9e99iLGnl2uJMjc5B+4y3O7x610=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b h1:QRR6H1YWRnHb4Y/HeNFCTJLFVxaq6wH4YuVdsUOr75U=
 gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
+gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
 gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
-gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
 gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
+gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o=
 gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
 gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
 gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU=
 gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
-gopkg.in/jcmturner/aescts.v1 v1.0.1 h1:cVVZBK2b1zY26haWB4vbBiZrfFQnfbTVrE3xZq6hrEw=
-gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo=
-gopkg.in/jcmturner/dnsutils.v1 v1.0.1 h1:cIuC1OLRGZrld+16ZJvvZxVJeKPsvd5eUIvxfoN5hSM=
-gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q=
-gopkg.in/jcmturner/goidentity.v3 v3.0.0 h1:1duIyWiTaYvVx3YX2CYtpJbUFd7/UuPYCfgXtQ3VTbI=
-gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4=
-gopkg.in/jcmturner/gokrb5.v7 v7.5.0 h1:a9tsXlIDD9SKxotJMK3niV7rPZAJeX2aD/0yg3qlIrg=
-gopkg.in/jcmturner/gokrb5.v7 v7.5.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM=
-gopkg.in/jcmturner/rpc.v1 v1.1.0 h1:QHIUxTX1ISuAv9dD2wJ9HWQVuWDX/Zc0PfeC2tjc4rU=
-gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8=
-gopkg.in/redis.v4 v4.2.4 h1:y3XbwQAiHwgNLUng56mgWYK39vsPqo8sT84XTEcxjr0=
 gopkg.in/redis.v4 v4.2.4/go.mod h1:8KREHdypkCEojGKQcjMqAODMICIVwZAONWq8RowTITA=
-gopkg.in/resty.v1 v1.12.0 h1:CuXP0Pjfw9rOuY6EP+UvtNvt5DSqHpIxILZKT/quCZI=
 gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
-gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
 gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
+gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
 gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
 gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
@@ -966,14 +916,15 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
 gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ=
 gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
+gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
-honnef.co/go/tools v0.0.1-2020.1.3 h1:sXmLre5bzIR6ypkjXCDI3jHPssRhc8KD/Ome589sc3U=
 honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
 k8s.io/api v0.21.0 h1:gu5iGF4V6tfVCQ/R+8Hc0h7H1JuEhzyEi9S4R5LM8+Y=
 k8s.io/api v0.21.0/go.mod h1:+YbrhBBGgsxbF6o6Kj4KJPJnBmAKuXDeS3E18bgHNVU=
@@ -981,23 +932,20 @@ k8s.io/apimachinery v0.21.0 h1:3Fx+41if+IRavNcKOz09FwEXDBG6ORh6iMsTSelhkMA=
 k8s.io/apimachinery v0.21.0/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY=
 k8s.io/client-go v0.21.0 h1:n0zzzJsAQmJngpC0IhgFcApZyoGXPrDIAD601HD09ag=
 k8s.io/client-go v0.21.0/go.mod h1:nNBytTF9qPFDEhoqgEPaarobC8QPae13bElIVHzIglA=
-k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac h1:sAvhNk5RRuc6FNYGqe7Ygz3PSo/2wGWbulskmzRX8Vs=
 k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
 k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
 k8s.io/klog/v2 v2.8.0 h1:Q3gmuM9hKEjefWFFYF0Mat+YyFJvsUyYuwyNNJ5C9Ts=
 k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec=
-k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 h1:vEx13qjvaZ4yfObSSXW7BrMc/KQBBT/Jyee8XtLf4x0=
 k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE=
 k8s.io/utils v0.0.0-20201110183641-67b214c5f920 h1:CbnUZsM497iRC5QMVkHwyl8s2tB3g7yaSHkYPkpgelw=
 k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
-rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE=
 rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
-rsc.io/quote/v3 v3.1.0 h1:9JKUTTIUgS6kzR9mK1YuGKv6Nl+DijDNIc0ghT58FaY=
 rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
-rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4=
 rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
 sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
 sigs.k8s.io/structured-merge-diff/v4 v4.1.0 h1:C4r9BgJ98vrKnnVCjwCSXcWjWe0NKcUQkmzDXZXGwH8=
 sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
+sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
 sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=
 sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
+sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU=
diff --git a/nucleus/gnmi_transport.go b/nucleus/gnmi_transport.go
index 178f09d5d..fb5b3016d 100644
--- a/nucleus/gnmi_transport.go
+++ b/nucleus/gnmi_transport.go
@@ -13,7 +13,7 @@ import (
 
 	ppb "code.fbi.h-da.de/danet/api/go/gosdn/pnd"
 
-	"code.fbi.h-da.de/danet/gosdn/forks/goarista/gnmi"
+	"code.fbi.h-da.de/danet/forks/goarista/gnmi"
 	"code.fbi.h-da.de/danet/gosdn/nucleus/errors"
 	"code.fbi.h-da.de/danet/gosdn/nucleus/types"
 	pathutils "code.fbi.h-da.de/danet/gosdn/nucleus/util/path"
diff --git a/nucleus/gnmi_transport_test.go b/nucleus/gnmi_transport_test.go
index 31ab5944b..578826b56 100644
--- a/nucleus/gnmi_transport_test.go
+++ b/nucleus/gnmi_transport_test.go
@@ -13,7 +13,7 @@ import (
 	spb "code.fbi.h-da.de/danet/api/go/gosdn/southbound"
 	tpb "code.fbi.h-da.de/danet/api/go/gosdn/transport"
 
-	"code.fbi.h-da.de/danet/gosdn/forks/goarista/gnmi"
+	"code.fbi.h-da.de/danet/forks/goarista/gnmi"
 	"code.fbi.h-da.de/danet/gosdn/mocks"
 	"code.fbi.h-da.de/danet/yang-models/generated/openconfig"
 	gpb "github.com/openconfig/gnmi/proto/gnmi"
diff --git a/nucleus/initialise_test.go b/nucleus/initialise_test.go
index 2ec97153e..093d08b71 100644
--- a/nucleus/initialise_test.go
+++ b/nucleus/initialise_test.go
@@ -9,7 +9,7 @@ import (
 
 	tpb "code.fbi.h-da.de/danet/api/go/gosdn/transport"
 
-	"code.fbi.h-da.de/danet/gosdn/forks/goarista/gnmi"
+	"code.fbi.h-da.de/danet/forks/goarista/gnmi"
 	"code.fbi.h-da.de/danet/gosdn/mocks"
 	"code.fbi.h-da.de/danet/gosdn/nucleus/util/proto"
 	"code.fbi.h-da.de/danet/gosdn/test"
diff --git a/nucleus/principalNetworkDomain.go b/nucleus/principalNetworkDomain.go
index cf42d16c4..b01b663f6 100644
--- a/nucleus/principalNetworkDomain.go
+++ b/nucleus/principalNetworkDomain.go
@@ -12,7 +12,7 @@ import (
 	tpb "code.fbi.h-da.de/danet/api/go/gosdn/transport"
 	"google.golang.org/protobuf/proto"
 
-	"code.fbi.h-da.de/danet/gosdn/forks/goarista/gnmi"
+	"code.fbi.h-da.de/danet/forks/goarista/gnmi"
 	"code.fbi.h-da.de/danet/gosdn/interfaces/change"
 	"code.fbi.h-da.de/danet/gosdn/interfaces/device"
 	"code.fbi.h-da.de/danet/gosdn/interfaces/networkdomain"
diff --git a/test/integration/nucleusIntegration_test.go b/test/integration/nucleusIntegration_test.go
index 07dee94cd..4e2ec7a5a 100644
--- a/test/integration/nucleusIntegration_test.go
+++ b/test/integration/nucleusIntegration_test.go
@@ -2,19 +2,20 @@ package integration
 
 import (
 	"context"
-	"github.com/google/uuid"
 	"os"
 	"reflect"
 	"sort"
 	"testing"
 	"time"
 
+	"github.com/google/uuid"
+
 	ppb "code.fbi.h-da.de/danet/api/go/gosdn/pnd"
 	spb "code.fbi.h-da.de/danet/api/go/gosdn/southbound"
 	tpb "code.fbi.h-da.de/danet/api/go/gosdn/transport"
 	"code.fbi.h-da.de/danet/gosdn/interfaces/change"
 
-	"code.fbi.h-da.de/danet/gosdn/forks/goarista/gnmi"
+	"code.fbi.h-da.de/danet/forks/goarista/gnmi"
 	"code.fbi.h-da.de/danet/gosdn/nucleus"
 	"code.fbi.h-da.de/danet/gosdn/nucleus/errors"
 	"code.fbi.h-da.de/danet/gosdn/nucleus/types"
diff --git a/test/targets.go b/test/targets.go
index d72882b4b..4a59a0681 100644
--- a/test/targets.go
+++ b/test/targets.go
@@ -4,7 +4,7 @@ import (
 	"net"
 	"reflect"
 
-	"code.fbi.h-da.de/danet/gosdn/forks/google/gnmi"
+	"code.fbi.h-da.de/danet/forks/google/gnmi"
 	oc "code.fbi.h-da.de/danet/yang-models/generated/arista"
 	pb "github.com/openconfig/gnmi/proto/gnmi"
 	"github.com/openconfig/goyang/pkg/yang"
-- 
GitLab