From 70cf6ed98e557923198d72854eacb5a71653d9b0 Mon Sep 17 00:00:00 2001 From: KCarretto Date: Mon, 6 Jan 2025 01:10:18 +0000 Subject: [PATCH 1/3] added additional logging for reverse shells, all logs now include a unique tavern instance id --- tavern/app.go | 33 +++++++++++ tavern/config.go | 2 + tavern/internal/c2/api_reverse_shell.go | 73 ++++++++++++++++++----- tavern/internal/http/stream/mux.go | 74 +++++++++++++++++++----- tavern/internal/http/stream/stream.go | 35 +++++++---- tavern/internal/http/stream/websocket.go | 38 ++++++++++-- 6 files changed, 210 insertions(+), 45 deletions(-) diff --git a/tavern/app.go b/tavern/app.go index 25b8d96d1..0b8866bd0 100644 --- a/tavern/app.go +++ b/tavern/app.go @@ -18,6 +18,7 @@ import ( "github.com/99designs/gqlgen/graphql/playground" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/urfave/cli" + "golang.org/x/exp/slog" "golang.org/x/net/http2" "golang.org/x/net/http2/h2c" "google.golang.org/grpc" @@ -30,10 +31,15 @@ import ( "realm.pub/tavern/internal/graphql" tavernhttp "realm.pub/tavern/internal/http" "realm.pub/tavern/internal/http/stream" + "realm.pub/tavern/internal/namegen" "realm.pub/tavern/internal/www" "realm.pub/tavern/tomes" ) +func init() { + configureLogging() +} + func newApp(ctx context.Context, options ...func(*Config)) (app *cli.App) { app = cli.NewApp() app.Name = "tavern" @@ -350,3 +356,30 @@ func registerProfiler(router tavernhttp.RouteMap) { router.Handle("/debug/pprof/threadcreate", pprof.Handler("threadcreate")) router.Handle("/debug/pprof/block", pprof.Handler("block")) } + +func configureLogging() { + // Generate new instance ID as prefix (helps in deployments with multiple tavern instances) + var ( + instanceID = namegen.NewSimple() + logger *slog.Logger + ) + + // Setup Default Logger + if EnvDebugLogging.String() == "" { + // Production Logging + logger = slog.New(slog.NewJSONHandler(os.Stderr, &slog.HandlerOptions{ + Level: slog.LevelInfo, + })). + With("tavern_id", instanceID) + } else { + // Debug Logging + logger = slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{ + Level: slog.LevelDebug, + AddSource: true, + })). + With("tavern_id", instanceID) + } + + slog.SetDefault(logger) + slog.Debug("Debug logging enabled 🕵️ ") +} diff --git a/tavern/config.go b/tavern/config.go index 365e66b28..265430061 100644 --- a/tavern/config.go +++ b/tavern/config.go @@ -24,9 +24,11 @@ var ( // EnvEnableTestData if set will populate the database with test data. // EnvEnableTestRunAndExit will start the application, but exit immediately after. // EnvDisableDefaultTomes will prevent the default tomes from being imported on startup. + // EnvDebugLogging will emit verbose debug logs to help troubleshoot issues. EnvEnableTestData = EnvString{"ENABLE_TEST_DATA", ""} EnvEnableTestRunAndExit = EnvString{"ENABLE_TEST_RUN_AND_EXIT", ""} EnvDisableDefaultTomes = EnvString{"DISABLE_DEFAULT_TOMES", ""} + EnvDebugLogging = EnvString{"ENABLE_DEBUG_LOGGING", ""} // EnvHTTPListenAddr sets the address (ip:port) for tavern's HTTP server to bind to. // EnvHTTPMetricsAddr sets the address (ip:port) for the HTTP metrics server to bind to. diff --git a/tavern/internal/c2/api_reverse_shell.go b/tavern/internal/c2/api_reverse_shell.go index 0f01ba700..041c1615f 100644 --- a/tavern/internal/c2/api_reverse_shell.go +++ b/tavern/internal/c2/api_reverse_shell.go @@ -4,7 +4,7 @@ import ( "context" "fmt" "io" - "log" + "log/slog" "sync" "time" @@ -36,20 +36,25 @@ func (srv *Server) ReverseShell(gstream c2pb.C2_ReverseShellServer) error { task, err := srv.graph.Task.Get(ctx, int(registerMsg.TaskId)) if err != nil { if ent.IsNotFound(err) { + slog.ErrorContext(ctx, "reverse shell failed: associated task does not exist", "task_id", registerMsg.TaskId, "error", err) return status.Errorf(codes.NotFound, "task does not exist (task_id=%d)", registerMsg.TaskId) } + slog.ErrorContext(ctx, "reverse shell failed: could not load associated task", "task_id", registerMsg.TaskId, "error", err) return status.Errorf(codes.Internal, "failed to load task ent (task_id=%d): %v", registerMsg.TaskId, err) } beacon, err := task.Beacon(ctx) if err != nil { + slog.ErrorContext(ctx, "reverse shell failed: could not load associated beacon", "task_id", registerMsg.TaskId, "error", err) return status.Errorf(codes.Internal, "failed to load beacon ent (task_id=%d): %v", registerMsg.TaskId, err) } quest, err := task.Quest(ctx) if err != nil { + slog.ErrorContext(ctx, "reverse shell failed: could not load associated quest", "task_id", registerMsg.TaskId, "error", err) return status.Errorf(codes.Internal, "failed to load quest ent (task_id=%d): %v", registerMsg.TaskId, err) } creator, err := quest.Creator(ctx) if err != nil { + slog.ErrorContext(ctx, "reverse shell failed: could not load associated quest creator", "task_id", registerMsg.TaskId, "error", err) return status.Errorf(codes.Internal, "failed to load quest creator (task_id=%d): %v", registerMsg.TaskId, err) } @@ -61,13 +66,27 @@ func (srv *Server) ReverseShell(gstream c2pb.C2_ReverseShellServer) error { SetData([]byte{}). Save(ctx) if err != nil { + slog.ErrorContext(ctx, "reverse shell failed: could not create shell entity", "task_id", registerMsg.TaskId, "error", err) return status.Errorf(codes.Internal, "failed to create shell: %v", err) } shellID := shell.ID // Log Shell Session - log.Printf("[gRPC] Reverse Shell Started (shell_id=%d)", shellID) - defer log.Printf("[gRPC] Reverse Shell Closed (shell_id=%d)", shellID) + slog.InfoContext(ctx, "started gRPC reverse shell", + "shell_id", shellID, + "task_id", registerMsg.TaskId, + "creator_id", creator.ID, + ) + defer func(start time.Time) { + slog.InfoContext(ctx, "closed gRPC reverse shell", + "started_at", start.String(), + "ended_at", time.Now().String(), + "duration", time.Since(start).String(), + "shell_id", shellID, + "task_id", registerMsg.TaskId, + "creator_id", creator.ID, + ) + }(time.Now()) // Create new Stream pubsubStream := stream.New(fmt.Sprintf("%d", shellID)) @@ -81,25 +100,34 @@ func (srv *Server) ReverseShell(gstream c2pb.C2_ReverseShellServer) error { defer cancel() // Notify Subscribers that the stream is closed - log.Printf("[gRPC][ReverseShell] Sending stream close message") + slog.DebugContext(ctx, "reverse shell closed, sending stream close message", "shell_id", shell.ID) if err := pubsubStream.SendMessage(ctx, &pubsub.Message{ Metadata: map[string]string{ stream.MetadataStreamClose: fmt.Sprintf("%d", shellID), }, }, srv.mux); err != nil { - log.Printf("[gRPC][ReverseShell][ERROR] Failed to notify subscribers that shell was closed: %v", err) + slog.ErrorContext(ctx, "reverse shell closed and failed to notify subscribers", + "shell_id", shell.ID, + "error", err, + ) } // Update Ent shell, err := srv.graph.Shell.Get(ctx, shellID) if err != nil { - log.Printf("[gRPC][ReverseShell][ERROR] Failed to retrieve shell ent to update it as closed: %v", err) + slog.ErrorContext(ctx, "reverse shell closed and failed to load ent for updates", + "error", err, + "shell_id", shell.ID, + ) return } if _, err := shell.Update(). SetClosedAt(closedAt). Save(ctx); err != nil { - log.Printf("[gRPC][ReverseShell][ERROR] Failed to update shell ent as closed: %v", err) + slog.ErrorContext(ctx, "reverse shell closed and failed to update ent", + "error", err, + "shell_id", shell.ID, + ) } }() @@ -121,35 +149,44 @@ func (srv *Server) ReverseShell(gstream c2pb.C2_ReverseShellServer) error { wg.Add(1) go func() { defer wg.Done() - sendShellInput(ctx, gstream, pubsubStream) + sendShellInput(ctx, shellID, gstream, pubsubStream) }() // Send Output (to pubsub) - err = sendShellOutput(ctx, gstream, pubsubStream, srv.mux) + err = sendShellOutput(ctx, shellID, gstream, pubsubStream, srv.mux) wg.Wait() return err } -func sendShellInput(ctx context.Context, gstream c2pb.C2_ReverseShellServer, pubsubStream *stream.Stream) { +func sendShellInput(ctx context.Context, shellID int, gstream c2pb.C2_ReverseShellServer, pubsubStream *stream.Stream) { for { select { case <-ctx.Done(): return case msg := <-pubsubStream.Messages(): + msgLen := len(msg.Body) if err := gstream.Send(&c2pb.ReverseShellResponse{ Kind: c2pb.ReverseShellMessageKind_REVERSE_SHELL_MESSAGE_KIND_DATA, Data: msg.Body, }); err != nil { - log.Printf("[ERROR] Failed to send gRPC input: %v", err) + slog.ErrorContext(ctx, "failed to send shell input to reverse shell", + "shell_id", shellID, + "msg_len", msgLen, + "error", err, + ) return } + slog.DebugContext(ctx, "reverse shell sent input to agent via gRPC", + "shell_id", shellID, + "msg_len", msgLen, + ) } } } -func sendShellOutput(ctx context.Context, gstream c2pb.C2_ReverseShellServer, pubsubStream *stream.Stream, mux *stream.Mux) error { +func sendShellOutput(ctx context.Context, shellID int, gstream c2pb.C2_ReverseShellServer, pubsubStream *stream.Stream, mux *stream.Mux) error { for { req, err := gstream.Recv() if err == io.EOF { @@ -165,11 +202,21 @@ func sendShellOutput(ctx context.Context, gstream c2pb.C2_ReverseShellServer, pu } // Send Pubsub Message + msgLen := len(req.Data) if err := pubsubStream.SendMessage(ctx, &pubsub.Message{ Body: req.Data, }, mux); err != nil { + slog.ErrorContext(ctx, "reverse shell failed to publish shell output", + "shell_id", shellID, + "msg_len", msgLen, + "error", err, + ) return status.Errorf(codes.Internal, "failed to publish message: %v", err) } + slog.DebugContext(ctx, "reverse shell published shell output", + "shell_id", shellID, + "msg_len", msgLen, + ) } } @@ -185,7 +232,7 @@ func sendKeepAlives(ctx context.Context, gstream c2pb.C2_ReverseShellServer) { if err := gstream.Send(&c2pb.ReverseShellResponse{ Kind: c2pb.ReverseShellMessageKind_REVERSE_SHELL_MESSAGE_KIND_PING, }); err != nil { - log.Printf("[ERROR] Failed to send gRPC ping: %v", err) + slog.ErrorContext(ctx, "reverse shell failed to send gRPC keep alive ping", "error", err) } } } diff --git a/tavern/internal/http/stream/mux.go b/tavern/internal/http/stream/mux.go index 611d1276c..cbad24215 100644 --- a/tavern/internal/http/stream/mux.go +++ b/tavern/internal/http/stream/mux.go @@ -7,6 +7,7 @@ import ( "github.com/gorilla/websocket" "gocloud.dev/pubsub" + "golang.org/x/exp/slog" ) const ( @@ -32,15 +33,22 @@ type Mux struct { streams map[*Stream]bool } +// A MuxOption is used to provide further configuration to the Mux. +type MuxOption func(*Mux) + // NewMux initializes and returns a new Mux with the provided pubsub info. -func NewMux(pub *pubsub.Topic, sub *pubsub.Subscription) *Mux { - return &Mux{ +func NewMux(pub *pubsub.Topic, sub *pubsub.Subscription, options ...MuxOption) *Mux { + mux := &Mux{ pub: pub, sub: sub, register: make(chan *Stream, maxRegistrationBufSize), unregister: make(chan *Stream, maxRegistrationBufSize), streams: make(map[*Stream]bool), } + for _, opt := range options { + opt(mux) + } + return mux } // send a new message to the configured publish topic. @@ -59,11 +67,12 @@ func (mux *Mux) Register(s *Stream) { } // registerStreams inserts all registered streams into the streams map. -func (mux *Mux) registerStreams() { +func (mux *Mux) registerStreams(ctx context.Context) { for { select { - case r := <-mux.register: - mux.streams[r] = true + case s := <-mux.register: + slog.DebugContext(ctx, "mux registering new stream", "stream_id", s.id) + mux.streams[s] = true default: return } @@ -78,11 +87,11 @@ func (mux *Mux) Unregister(s *Stream) { } // unregisterStreams deletes all unregistered streams from the streams map. -func (mux *Mux) unregisterStreams() { +func (mux *Mux) unregisterStreams(ctx context.Context) { for { select { case s := <-mux.unregister: - + slog.DebugContext(ctx, "mux unregistering stream", "stream_id", s.id) delete(mux.streams, s) s.Close() default: @@ -93,17 +102,22 @@ func (mux *Mux) unregisterStreams() { // Start the mux, returning an error if polling ever fails. func (mux *Mux) Start(ctx context.Context) error { + slog.DebugContext(ctx, "mux starting to manage streams and polling") for { // Manage Streams - mux.registerStreams() - mux.unregisterStreams() + mux.registerStreams(ctx) + mux.unregisterStreams(ctx) // Poll for new messages select { case <-ctx.Done(): + slog.DebugContext(ctx, "mux context finished, exiting") return ctx.Err() default: - mux.poll(ctx) + slog.DebugContext(ctx, "mux polling for message") + if err := mux.poll(ctx); err != nil { + slog.ErrorContext(ctx, "mux failed to poll subscription", "error", err) + } } } } @@ -121,13 +135,45 @@ func (mux *Mux) poll(ctx context.Context) error { defer msg.Ack() // Manage Streams - mux.registerStreams() - mux.unregisterStreams() + mux.registerStreams(ctx) + mux.unregisterStreams(ctx) + + // Get Message Metadata + msgID, ok := msg.Metadata["id"] + if !ok { + slog.DebugContext(ctx, "mux received message without 'id' for stream, ignoring") + return nil + } + msgOrderKey, ok := msg.Metadata[metadataOrderKey] + if !ok { + slog.DebugContext(ctx, "mux received message without metadataOrderKey") + } + msgOrderIndex, ok := msg.Metadata[metadataOrderIndex] + if !ok { + slog.DebugContext(ctx, "mux received message without msgOrderIndex") + } // Broadcast Message + slog.DebugContext(ctx, "mux broadcasting received message", + "msg_id", msgID, + "msg_order_key", msgOrderKey, + "msg_order_index", msgOrderIndex, + "stream_count", len(mux.streams), + ) for s := range mux.streams { - if msg.Metadata["id"] == s.id { - s.processOneMessage(msg) + if s == nil { + slog.ErrorContext(ctx, "mux found nil stream in map while broadcasting message, skipping stream", "msg_id", msgID) + continue + } + + if s.id == msgID { + slog.DebugContext(ctx, "mux sending message to stream", + "msg_id", msgID, + "stream_id", s.id, + "stream_order_key", s.orderKey, + "stream_index", s.orderIndex.Load(), + ) + s.processOneMessage(ctx, msg) } } diff --git a/tavern/internal/http/stream/stream.go b/tavern/internal/http/stream/stream.go index 0bfc3c8e6..46a179d24 100644 --- a/tavern/internal/http/stream/stream.go +++ b/tavern/internal/http/stream/stream.go @@ -6,7 +6,7 @@ import ( "encoding/base64" "fmt" "io" - "log" + "log/slog" "strconv" "sync" "sync/atomic" @@ -37,12 +37,12 @@ const ( type Stream struct { mu sync.Mutex - id string - orderKey string + id string // ID of the underlying ent (e.g. Shell) + orderKey string // Unique ID for the session (e.g. Websocket) orderIndex *atomic.Uint64 recv chan *pubsub.Message recvOrdered chan *pubsub.Message - buffers map[string]*sessionBuffer + buffers map[string]*sessionBuffer // Receive messages, bucket by sender (order-key), and order messages from same sender } // New initializes a new stream that will only receive messages with the provided ID. @@ -97,11 +97,13 @@ func (s *Stream) Close() error { // processOneMessage is called by a Mux to receive a new pubsub message designated for this stream. // It may be unordered. -func (s *Stream) processOneMessage(msg *pubsub.Message) { +func (s *Stream) processOneMessage(ctx context.Context, msg *pubsub.Message) { s.mu.Lock() defer s.mu.Unlock() - // Get Buffer + // Get Buffer for the given order-key + // We order all messages within the same order key, or create a new one + // if we have not seen this order key yet. key := parseOrderKey(msg) buf, ok := s.buffers[key] if !ok || buf == nil { @@ -112,10 +114,10 @@ func (s *Stream) processOneMessage(msg *pubsub.Message) { } // Write Message (or buffer it) - buf.writeMessage(msg, s.recvOrdered) + buf.writeMessage(ctx, msg, s.recvOrdered) // Flush possible messages from buffer - buf.flushBuffer(s.recvOrdered) + buf.flushBuffer(ctx, s.recvOrdered) } func parseOrderKey(msg *pubsub.Message) string { @@ -144,7 +146,7 @@ func newOrderKey() string { buf := make([]byte, 16) _, err := io.ReadFull(rand.Reader, buf) if err != nil { - log.Printf("[ERROR] Failed to generate %q, defaulting to empty string!", metadataOrderKey) + slog.Error("failed to generate order key, defaulting to empty string!", "error", err) return "" } return base64.StdEncoding.EncodeToString(buf) @@ -162,9 +164,10 @@ type sessionBuffer struct { data map[uint64]*pubsub.Message } -func (buf *sessionBuffer) writeMessage(msg *pubsub.Message, dst chan<- *pubsub.Message) { +func (buf *sessionBuffer) writeMessage(ctx context.Context, msg *pubsub.Message, dst chan<- *pubsub.Message) { index, ok := parseOrderIndex(msg) if !ok { + slog.DebugContext(ctx, "sessionBuffer received no order index, will write immediately and not buffer") dst <- msg } else if index == buf.nextToSend || buf.nextToSend == 0 { // If we receive the message we're looking for or if this is the first @@ -174,19 +177,27 @@ func (buf *sessionBuffer) writeMessage(msg *pubsub.Message, dst chan<- *pubsub.M } else if index < buf.nextToSend { // We prefer to drop messages instead of sending them out of order // If we receive a message after a subsequent one has been sent, drop it - log.Printf("[ERROR] dropping message (index=%d), subsequent message has already been sent", index) + slog.ErrorContext(ctx, "dropping message because subsequent message has already been sent", + "msg_log_id", msg.LoggableID, + "next_to_send", buf.nextToSend, + "order_index", index, + ) } else { // If we receive the message out of order, buffer it buf.data[index] = msg } } -func (buf *sessionBuffer) flushBuffer(dst chan<- *pubsub.Message) { +func (buf *sessionBuffer) flushBuffer(ctx context.Context, dst chan<- *pubsub.Message) { for { msg, ok := buf.data[buf.nextToSend] if !ok || msg == nil { // If our buffer has grown too large, skip waiting for messages if len(buf.data) > maxStreamOrderBuf { + slog.ErrorContext(ctx, "sessionBuffer overflow, skipping message to catch up", + "skipped_message_index", buf.nextToSend, + "buffered_msgs_count", len(buf.data), + ) buf.nextToSend += 1 continue } diff --git a/tavern/internal/http/stream/websocket.go b/tavern/internal/http/stream/websocket.go index 3da347f65..ab276db50 100644 --- a/tavern/internal/http/stream/websocket.go +++ b/tavern/internal/http/stream/websocket.go @@ -3,6 +3,7 @@ package stream import ( "context" "log" + "log/slog" "net/http" "strconv" "sync" @@ -65,7 +66,10 @@ func (c *connector) WriteToWebsocket(ctx context.Context) { hasClosed, ok := message.Metadata[MetadataStreamClose] if ok && hasClosed != "" { // The producer ended the stream. - log.Printf("[WS] Closing websocket, stream has ended (stream_id=%s)", c.Stream.id) + slog.DebugContext(ctx, "websocket closed due to producer ending stream", + "stream_id", c.Stream.id, + "stream_order_key", c.Stream.orderKey, + ) c.ws.WriteMessage(websocket.CloseMessage, []byte{}) return } @@ -74,13 +78,25 @@ func (c *connector) WriteToWebsocket(ctx context.Context) { if err != nil { return } - w.Write(message.Body) + if _, err := w.Write(message.Body); err != nil { + slog.ErrorContext(ctx, "failed to write message from producer to websocket", + "stream_id", c.Stream.id, + "stream_order_key", c.Stream.orderKey, + "error", err, + ) + } - // Add queued messages to the current websocket message. + // Flush queued messages to the current websocket message. n := len(c.Messages()) for i := 0; i < n; i++ { additionalMsg := <-c.Messages() - w.Write(additionalMsg.Body) + if _, err := w.Write(additionalMsg.Body); err != nil { + slog.ErrorContext(ctx, "failed to write additional message from producer to websocket", + "stream_id", c.Stream.id, + "stream_order_key", c.Stream.orderKey, + "error", err, + ) + } } if err := w.Close(); err != nil { @@ -115,17 +131,27 @@ func (c *connector) ReadFromWebsocket(ctx context.Context) { _, message, err := c.ws.ReadMessage() if err != nil { if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) { - log.Printf("[WS][ERROR] websocket closed unexpectedly: %v", err) + slog.ErrorContext(ctx, "websocket closed unexpectedly", + "stream_id", c.Stream.id, + "stream_order_key", c.Stream.orderKey, + "error", err, + ) } return } + msgLen := len(message) if err := c.Stream.SendMessage(ctx, &pubsub.Message{ Body: message, Metadata: map[string]string{ metadataID: c.id, }, }, c.mux); err != nil { - log.Printf("[WS][ERROR] failed to publish message: %v", err) + slog.ErrorContext(ctx, "websocket failed to publish message", + "stream_id", c.Stream.id, + "stream_order_key", c.Stream.orderKey, + "msg_len", msgLen, + "error", err, + ) return } } From a8fdacdd01889241f78bc5b12127b18ad5584a2b Mon Sep 17 00:00:00 2001 From: KCarretto Date: Mon, 6 Jan 2025 01:12:21 +0000 Subject: [PATCH 2/3] log/slog not x anymore --- tavern/app.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tavern/app.go b/tavern/app.go index 0b8866bd0..345603701 100644 --- a/tavern/app.go +++ b/tavern/app.go @@ -7,6 +7,7 @@ import ( "encoding/json" "fmt" "log" + "log/slog" "net/http" "net/http/pprof" "os" @@ -18,7 +19,6 @@ import ( "github.com/99designs/gqlgen/graphql/playground" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/urfave/cli" - "golang.org/x/exp/slog" "golang.org/x/net/http2" "golang.org/x/net/http2/h2c" "google.golang.org/grpc" From 82c909ced3992212ee4af752d31b459c5af32880 Mon Sep 17 00:00:00 2001 From: KCarretto Date: Mon, 6 Jan 2025 01:20:27 +0000 Subject: [PATCH 3/3] fix tests --- go.mod | 4 ++-- go.sum | 46 +++++++++++++++++++++++++++++++++++----------- 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/go.mod b/go.mod index b113c06fc..0cba546c4 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module realm.pub -go 1.20 +go 1.23 require ( entgo.io/contrib v0.4.5 @@ -96,7 +96,7 @@ require ( github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect github.com/zclconf/go-cty v1.14.1 // indirect gocloud.dev v0.37.0 - golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect + golang.org/x/exp v0.0.0-20231006140011-7918f672742d golang.org/x/mod v0.17.0 // indirect golang.org/x/sys v0.28.0 // indirect golang.org/x/text v0.21.0 // indirect diff --git a/go.sum b/go.sum index bd3e17ef9..211513d49 100644 --- a/go.sum +++ b/go.sum @@ -2,6 +2,7 @@ ariga.io/atlas v0.14.2 h1:efxCuSGnDuhx7xm4JaqImR6xd+PqyizgGy5u/XUEI/g= ariga.io/atlas v0.14.2/go.mod h1:isZrlzJ5cpoCoKFoY9knZug7Lq4pP1cm8g3XciLZ0Pw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.112.1 h1:uJSeirPke5UNZHIb4SxfZklVSiWWVqW4oXlETwZziwM= +cloud.google.com/go v0.112.1/go.mod h1:+Vbu+Y1UU+I1rjmzeMOb/8RfkKJK2Gyxi1X6jJCZLo4= cloud.google.com/go/compute v1.25.0 h1:H1/4SqSUhjPFE7L5ddzHOfY2bCAvjwNRZPNl6Ni5oYU= cloud.google.com/go/compute v1.25.0/go.mod h1:GR7F0ZPZH8EhChlMo9FkLd7eUTwEymjqQagxzilIxIE= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= @@ -22,6 +23,7 @@ github.com/99designs/gqlgen v0.17.39 h1:wPTAyc2fqVjAWT5DsJ21k/lLudgnXzURwbsjVNeg github.com/99designs/gqlgen v0.17.39/go.mod h1:b62q1USk82GYIVjC60h02YguAZLqYZtvWml8KkhJps4= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= +github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= @@ -32,26 +34,43 @@ github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki github.com/agnivade/levenshtein v1.1.1 h1:QY8M92nrzkmr798gCo3kmMyqXFzdQVpxLlGPRBij0P8= github.com/agnivade/levenshtein v1.1.1/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig+0+Ap1h4unLjW6YQJpKZVmUzxsD4E/Q= github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/aws/aws-sdk-go v1.50.36 h1:PjWXHwZPuTLMR1NIb8nEjLucZBMzmf84TLoLbD8BZqk= +github.com/aws/aws-sdk-go v1.50.36/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/aws/aws-sdk-go-v2 v1.25.3 h1:xYiLpZTQs1mzvz5PaI6uR0Wh57ippuEthxS4iK5v0n0= +github.com/aws/aws-sdk-go-v2 v1.25.3/go.mod h1:35hUlJVYd+M++iLI3ALmVwMOyRYMmRqUXpTtRGW+K9I= github.com/aws/aws-sdk-go-v2/config v1.27.7 h1:JSfb5nOQF01iOgxFI5OIKWwDiEXWTyTgg1Mm1mHi0A4= +github.com/aws/aws-sdk-go-v2/config v1.27.7/go.mod h1:PH0/cNpoMO+B04qET699o5W92Ca79fVtbUnvMIZro4I= github.com/aws/aws-sdk-go-v2/credentials v1.17.7 h1:WJd+ubWKoBeRh7A5iNMnxEOs982SyVKOJD+K8HIezu4= +github.com/aws/aws-sdk-go-v2/credentials v1.17.7/go.mod h1:UQi7LMR0Vhvs+44w5ec8Q+VS+cd10cjwgHwiVkE0YGU= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.3 h1:p+y7FvkK2dxS+FEwRIDHDe//ZX+jDhP8HHE50ppj4iI= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.3/go.mod h1:/fYB+FZbDlwlAiynK9KDXlzZl3ANI9JkD0Uhz5FjNT4= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.3 h1:ifbIbHZyGl1alsAhPIYsHOg5MuApgqOvVeI8wIugXfs= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.3/go.mod h1:oQZXg3c6SNeY6OZrDY+xHcF4VGIEoNotX2B4PrDeoJI= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.3 h1:Qvodo9gHG9F3E8SfYOspPeBt0bjSbsevK8WhRAUHcoY= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.3/go.mod h1:vCKrdLXtybdf/uQd/YfVR2r5pcbNuEYKzMQpcxmeSJw= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1 h1:EyBZibRTVAs6ECHZOw5/wlylS9OcTzwyjeQMudmREjE= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1/go.mod h1:JKpmtYhhPs7D97NL/ltqz7yCkERFW5dOlHyVl66ZYF8= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.5 h1:K/NXvIftOlX+oGgWGIa3jDyYLDNsdVhsjHmsBH2GLAQ= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.5/go.mod h1:cl9HGLV66EnCmMNzq4sYOti+/xo8w34CsgzVtm2GgsY= github.com/aws/aws-sdk-go-v2/service/sso v1.20.2 h1:XOPfar83RIRPEzfihnp+U6udOveKZJvPQ76SKWrLRHc= +github.com/aws/aws-sdk-go-v2/service/sso v1.20.2/go.mod h1:Vv9Xyk1KMHXrR3vNQe8W5LMFdTjSeWk0gBZBzvf3Qa0= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.2 h1:pi0Skl6mNl2w8qWZXcdOyg197Zsf4G97U7Sso9JXGZE= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.2/go.mod h1:JYzLoEVeLXk+L4tn1+rrkfhkxl6mLDEVaDSvGq9og90= github.com/aws/aws-sdk-go-v2/service/sts v1.28.4 h1:Ppup1nVNAOWbBOrcoOxaxPeEnSFB2RnnQdguhXpmeQk= +github.com/aws/aws-sdk-go-v2/service/sts v1.28.4/go.mod h1:+K1rNPVyGxkRuv9NNiaZ4YhBFuyw2MMA9SlIJ1Zlpz8= github.com/aws/smithy-go v1.20.1 h1:4SZlSlMr36UEqC7XOyRVb27XMeZubNcBNN+9IgEPIQw= +github.com/aws/smithy-go v1.20.1/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= 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/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= @@ -73,6 +92,7 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48 h1:fRzb/w+pyskVMQ+UbP35JkH8yB7MYb4q/qhBarqZE6g= github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA= github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= +github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -82,11 +102,13 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY= +github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= github.com/go-git/go-git/v5 v5.11.0 h1:XIZc1p+8YzypNr34itUfSvYJcv+eYdTnTvOZ2vD3cA4= github.com/go-git/go-git/v5 v5.11.0/go.mod h1:6GFcX2P3NM7FPBfpePbpLd21XxsgdAt+lKqXmCUiUCY= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -99,6 +121,7 @@ github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12f github.com/go-sql-driver/mysql v1.8.0 h1:UtktXaU2Nb64z/pLiGIxY4431SJ4/dR5cjMmlVHgnT4= github.com/go-sql-driver/mysql v1.8.0/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= +github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -129,8 +152,11 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-replayers/grpcreplay v1.1.0 h1:S5+I3zYyZ+GQz68OfbURDdt/+cSMqCK1wrvNx7WBzTE= +github.com/google/go-replayers/grpcreplay v1.1.0/go.mod h1:qzAvJ8/wi57zq7gWqaE6AwLM6miiXUQwP1S+I9icmhk= github.com/google/go-replayers/httpreplay v1.2.0 h1:VM1wEyyjaoU53BwrOnaf9VhAyQQEEioJvFYxYcLRKzk= +github.com/google/go-replayers/httpreplay v1.2.0/go.mod h1:WahEFFZZ7a1P4VM1qEeHy+tME4bwyqPcwWbNlUI1Mcg= github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= @@ -157,14 +183,18 @@ github.com/hashicorp/hcl/v2 v2.18.1/go.mod h1:ThLC89FV4p9MPW804KVbe/cEXoQ8NZEh+J github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 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/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= @@ -174,6 +204,7 @@ github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTS github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -190,6 +221,7 @@ github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGy github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -236,6 +268,7 @@ go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= go.opentelemetry.io/otel/sdk v1.22.0 h1:6coWHw9xw7EfClIC/+O31R8IY3/+EiRFHevmHafB2Gw= +go.opentelemetry.io/otel/sdk v1.22.0/go.mod h1:iu7luyVGYovrRpe2fmj3CVKouQNdTOkxtLzPvPz1DOc= go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= gocloud.dev v0.37.0 h1:XF1rN6R0qZI/9DYjN16Uy0durAmSlf58DHOcb28GPro= @@ -248,8 +281,6 @@ golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2Uz golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -261,7 +292,6 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= @@ -281,8 +311,6 @@ golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= -golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -294,7 +322,6 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= @@ -317,8 +344,6 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -329,8 +354,8 @@ golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= -golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -341,7 +366,6 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= @@ -356,7 +380,6 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= -golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= @@ -402,6 +425,7 @@ google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHh gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/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-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=